public function testMergeWithWiths()
 {
     $c1 = new ModelCriteria('bookstore', 'Book', 'b');
     $c1->leftJoinWith('b.Author a');
     $c2 = new ModelCriteria('bookstore', 'Author');
     $c1->mergeWith($c2);
     $with = $c1->getWith();
     $this->assertEquals(1, count($with), 'mergeWith() does not remove an existing join');
     $this->assertEquals('LEFT JOIN : book.AUTHOR_ID=a.ID(ignoreCase not considered) tableMap: AuthorTableMap relationMap: Author previousJoin: null relationAlias: a', $with['a']->__toString(), 'mergeWith() does not remove an existing join');
     $c1 = new ModelCriteria('bookstore', 'Book', 'b');
     $c2 = new ModelCriteria('bookstore', 'Book', 'b');
     $c2->leftJoinWith('b.Author a');
     $c1->mergeWith($c2);
     $with = $c1->getWith();
     $this->assertEquals(1, count($with), 'mergeWith() merge joins to an empty join');
     $this->assertEquals('LEFT JOIN : book.AUTHOR_ID=a.ID(ignoreCase not considered) tableMap: AuthorTableMap relationMap: Author previousJoin: null relationAlias: a', $with['a']->__toString(), 'mergeWith() merge joins to an empty join');
     $c1 = new ModelCriteria('bookstore', 'Book', 'b');
     $c1->leftJoinWith('b.Author a');
     $c2 = new ModelCriteria('bookstore', 'Book', 'b');
     $c2->innerJoinWith('b.Publisher p');
     $c1->mergeWith($c2);
     $with = $c1->getWith();
     $this->assertEquals(2, count($with), 'mergeWith() merge joins to an existing join');
     $this->assertEquals('LEFT JOIN : book.AUTHOR_ID=a.ID(ignoreCase not considered) tableMap: AuthorTableMap relationMap: Author previousJoin: null relationAlias: a', $with['a']->__toString(), 'mergeWith() merge joins to an empty join');
     $this->assertEquals('INNER JOIN : book.PUBLISHER_ID=p.ID(ignoreCase not considered) tableMap: PublisherTableMap relationMap: Publisher previousJoin: null relationAlias: p', $with['p']->__toString(), 'mergeWith() merge joins to an empty join');
 }
示例#2
0
 public function testMergeWithWiths()
 {
     $c1 = new ModelCriteria('bookstore', 'Book', 'b');
     $c1->leftJoinWith('b.Author a');
     $c2 = new ModelCriteria('bookstore', 'Author');
     $c1->mergeWith($c2);
     $with = $c1->getWith();
     $this->assertEquals(1, count($with), 'mergeWith() does not remove an existing join');
     $this->assertEquals('modelName: Author, relationName: Author, relationMethod: setAuthor, leftPhpName: , rightPhpName: a', $with['a']->__toString(), 'mergeWith() does not remove an existing join');
     $c1 = new ModelCriteria('bookstore', 'Book', 'b');
     $c2 = new ModelCriteria('bookstore', 'Book', 'b');
     $c2->leftJoinWith('b.Author a');
     $c1->mergeWith($c2);
     $with = $c1->getWith();
     $this->assertEquals(1, count($with), 'mergeWith() merge joins to an empty join');
     $this->assertEquals('modelName: Author, relationName: Author, relationMethod: setAuthor, leftPhpName: , rightPhpName: a', $with['a']->__toString(), 'mergeWith() merge joins to an empty join');
     $c1 = new ModelCriteria('bookstore', 'Book', 'b');
     $c1->leftJoinWith('b.Author a');
     $c2 = new ModelCriteria('bookstore', 'Book', 'b');
     $c2->innerJoinWith('b.Publisher p');
     $c1->mergeWith($c2);
     $with = $c1->getWith();
     $this->assertEquals(2, count($with), 'mergeWith() merge joins to an existing join');
     $this->assertEquals('modelName: Author, relationName: Author, relationMethod: setAuthor, leftPhpName: , rightPhpName: a', $with['a']->__toString(), 'mergeWith() merge joins to an empty join');
     $this->assertEquals('modelName: Publisher, relationName: Publisher, relationMethod: setPublisher, leftPhpName: , rightPhpName: p', $with['p']->__toString(), 'mergeWith() merge joins to an empty join');
 }
 /**
  * Constructor.
  *
  * @see ModelType How to use the preferred choices.
  *
  * @param string                    $class            The FQCN of the model class to be loaded.
  * @param string                    $labelPath        A property path pointing to the property used for the choice labels.
  * @param array                     $choices          An optional array to use, rather than fetching the models.
  * @param \ModelCriteria            $queryObject      The query to use retrieving model data from database.
  * @param string                    $groupPath        A property path pointing to the property used to group the choices.
  * @param array|\ModelCriteria      $preferred        The preferred items of this choice.
  *                                                    Either an array if $choices is given,
  *                                                    or a \ModelCriteria to be merged with the $queryObject.
  * @param PropertyAccessorInterface $propertyAccessor The reflection graph for reading property paths.
  * @param string                    $useAsIdentifier  a custom unique column (eg slug) to use instead of primary key.
  *
  * @throws MissingOptionsException In case the class parameter is empty.
  * @throws InvalidOptionsException In case the query class is not found.
  */
 public function __construct($class, $labelPath = null, $choices = null, $queryObject = null, $groupPath = null, $preferred = array(), PropertyAccessorInterface $propertyAccessor = null, $useAsIdentifier = null)
 {
     $this->class = $class;
     $queryClass = $this->class . 'Query';
     if (!class_exists($queryClass)) {
         if (empty($this->class)) {
             throw new MissingOptionsException('The "class" parameter is empty, you should provide the model class');
         }
         throw new InvalidOptionsException(sprintf('The query class "%s" is not found, you should provide the FQCN of the model class', $queryClass));
     }
     $query = new $queryClass();
     $this->query = $queryObject ?: $query;
     if ($useAsIdentifier) {
         $this->identifier = array($this->query->getTableMap()->getColumn($useAsIdentifier));
     } else {
         $this->identifier = $this->query->getTableMap()->getPrimaryKeys();
     }
     $this->loaded = is_array($choices) || $choices instanceof \Traversable;
     if ($preferred instanceof \ModelCriteria) {
         $this->preferredQuery = $preferred->mergeWith($this->query);
     }
     if (!$this->loaded) {
         // Make sure the constraints of the parent constructor are
         // fulfilled
         $choices = array();
         $preferred = array();
     }
     if (1 === count($this->identifier) && $this->isScalar(current($this->identifier))) {
         $this->identifierAsIndex = true;
     }
     parent::__construct($choices, $labelPath, $preferred, $groupPath, null, $propertyAccessor);
 }