public function testUseFkQueryTwiceTwoAliases() { $q = BookQuery::create()->useAuthorQuery('a')->filterByFirstName('Leo')->endUse()->useAuthorQuery('b')->filterByLastName('Tolstoi')->endUse(); $join1 = new ModelJoin(); $join1->setJoinType(Criteria::LEFT_JOIN); $join1->setTableMap(AuthorPeer::getTableMap()); $join1->setRelationMap(BookPeer::getTableMap()->getRelation('Author'), null, 'a'); $join1->setRelationAlias('a'); $join2 = new ModelJoin(); $join2->setJoinType(Criteria::LEFT_JOIN); $join2->setTableMap(AuthorPeer::getTableMap()); $join2->setRelationMap(BookPeer::getTableMap()->getRelation('Author'), null, 'b'); $join2->setRelationAlias('b'); $q1 = BookQuery::create()->addAlias('a', AuthorPeer::TABLE_NAME)->addJoinObject($join1, 'a')->add('a.FIRST_NAME', 'Leo', Criteria::EQUAL)->addAlias('b', AuthorPeer::TABLE_NAME)->addJoinObject($join2, 'b')->add('b.LAST_NAME', 'Tolstoi', Criteria::EQUAL); $this->assertTrue($q->equals($q1), 'useFkQuery() called twice on the same relation with two aliases creates two joins'); }
/** * Adds a JOIN clause to the query * Infers the ON clause from a relation name * Uses the Propel table maps, based on the schema, to guess the related columns * Beware that the default JOIN operator is INNER JOIN, while Criteria defaults to WHERE * Examples: * <code> * $c->join('Book.Author'); * => $c->addJoin(BookPeer::AUTHOR_ID, AuthorPeer::ID, Criteria::INNER_JOIN); * $c->join('Book.Author', Criteria::RIGHT_JOIN); * => $c->addJoin(BookPeer::AUTHOR_ID, AuthorPeer::ID, Criteria::RIGHT_JOIN); * $c->join('Book.Author a', Criteria::RIGHT_JOIN); * => $c->addAlias('a', AuthorPeer::TABLE_NAME); * => $c->addJoin(BookPeer::AUTHOR_ID, 'a.ID', Criteria::RIGHT_JOIN); * </code> * * @param string $relation Relation to use for the join * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' * * @return ModelCriteria The current object, for fluid interface */ public function join($relation, $joinType = Criteria::INNER_JOIN) { // relation looks like '$leftName.$relationName $relationAlias' list($fullName, $relationAlias) = self::getClassAndAlias($relation); if (strpos($fullName, '.') === false) { // simple relation name, refers to the current table $leftName = $this->getModelAliasOrName(); $relationName = $fullName; $previousJoin = $this->getPreviousJoin(); $tableMap = $this->getTableMap(); } else { list($leftName, $relationName) = explode('.', $fullName); $shortLeftName = self::getShortName($leftName); // find the TableMap for the left table using the $leftName if ($leftName == $this->getModelAliasOrName() || $leftName == $this->getModelShortName()) { $previousJoin = $this->getPreviousJoin(); $tableMap = $this->getTableMap(); } elseif (isset($this->joins[$leftName])) { $previousJoin = $this->joins[$leftName]; $tableMap = $previousJoin->getTableMap(); } elseif (isset($this->joins[$shortLeftName])) { $previousJoin = $this->joins[$shortLeftName]; $tableMap = $previousJoin->getTableMap(); } else { throw new PropelException('Unknown table or alias ' . $leftName); } } $leftTableAlias = isset($this->aliases[$leftName]) ? $leftName : null; // find the RelationMap in the TableMap using the $relationName if (!$tableMap->hasRelation($relationName)) { throw new PropelException('Unknown relation ' . $relationName . ' on the ' . $leftName . ' table'); } $relationMap = $tableMap->getRelation($relationName); // create a ModelJoin object for this join $join = new ModelJoin(); $join->setJoinType($joinType); if (null !== $previousJoin) { $join->setPreviousJoin($previousJoin); } $join->setRelationMap($relationMap, $leftTableAlias, $relationAlias); // add the ModelJoin to the current object if ($relationAlias !== null) { $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); $this->addJoinObject($join, $relationAlias); } else { $this->addJoinObject($join, $relationName); } return $this; }