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'); }
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); }