Exemple #1
0
 /**
  * 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;
 }