. */ Doctrine::autoload('Doctrine_Relation'); /** * Doctrine_Relation_Association * * This class is reponsible for lazy-loading the related objects in a many-to-many relation. * * @package Doctrine * @subpackage Relation * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * @link www.phpdoctrine.org * @since 1.0 * @version $Revision$ * @author Konsta Vesterinen */ class Doctrine_Relation_Association extends Doctrine_Relation { /** * @return Doctrine_Table */ public function getAssociationFactory() { return $this->definition['refTable']; } public function getAssociationTable() { return $this->definition['refTable']; } public function getAssociationClassName() { return $this->definition['refClass']; } /** * getRelationDql * * @param integer $count * @return string */ public function getRelationDql($count, $context = 'record') { //$table = $this->definition['refTable']; $assocRelationName = $this->definition['refClass']; $relatedClassName = $this->_foreignMapper->getComponentName(); switch ($context) { case "record": $sub = substr(str_repeat("?, ", $count),0,-2); $dql = "FROM $relatedClassName"; $dql .= " INNER JOIN $relatedClassName.$assocRelationName"; //$dql .= " ON $relatedClassName.$assocRelationName.$inverseJoinColumn = $relatedClassName.$relatedClassIdentifier"; $dql .= " WHERE $relatedClassName.$assocRelationName.{$this->definition['local']} IN ($sub)"; break; case "collection": $sub = substr(str_repeat("?, ", $count),0,-2); $dql = "FROM $assocRelationName INNER JOIN $assocRelationName.$relatedClassName"; //$dql .= " ON $relatedClassName.$assocRelationName.$inverseJoinColumn = $relatedClassName.$relatedClassIdentifier"; $dql .= " WHERE $assocRelationName.{$this->definition['local']} IN ($sub)"; break; } return $dql; } /** * fetchRelatedFor * * fetches a component related to given record * * @param Doctrine_Entity $record * @return Doctrine_Entity|Doctrine_Collection */ public function fetchRelatedFor(Doctrine_Entity $record) { // FIXME: composite key support $ids = $record->identifier(); $id = count($ids) > 0 ? array_pop($ids) : null; if (empty($id) || ! $this->_foreignMapper->getClassMetadata()->getAttribute(Doctrine::ATTR_LOAD_REFERENCES)) { $coll = new Doctrine_Collection($this->getForeignComponentName()); } else { $query = Doctrine_Query::create()->parseQuery($this->getRelationDql(1)); $coll = Doctrine_Query::create()->query($this->getRelationDql(1), array($id)); } $coll->setReference($record, $this); return $coll; } }