/lib/vendor/symfony-1.4.14/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Relation/Association/Self.php
https://github.com/yuya-takeyama/symfony-hackathon-20110924 · PHP · 116 lines · 67 code · 13 blank · 36 comment · 1 complexity · eccf36376414f7e459b12d58ee6fcabf MD5 · raw file
- <?php
- /*
- * $Id: Self.php 7490 2010-03-29 19:53:27Z jwage $
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the LGPL. For more information, see
- * <http://www.doctrine-project.org>.
- */
- /**
- * Doctrine_Relation_Association_Self
- *
- * @package Doctrine
- * @subpackage Relation
- * @license http://www.opensource.org/licenses/lgpl-license.php LGPL
- * @link www.doctrine-project.org
- * @since 1.0
- * @version $Revision: 7490 $
- * @author Konsta Vesterinen <kvesteri@cc.hut.fi>
- */
- class Doctrine_Relation_Association_Self extends Doctrine_Relation_Association
- {
- /**
- * getRelationDql
- *
- * @param integer $count
- * @return string
- */
- public function getRelationDql($count, $context = 'record')
- {
- switch ($context) {
- case 'record':
- $identifierColumnNames = $this->definition['table']->getIdentifierColumnNames();
- $identifier = array_pop($identifierColumnNames);
- $sub = 'SELECT '.$this->definition['foreign']
- . ' FROM '.$this->definition['refTable']->getTableName()
- . ' WHERE '.$this->definition['local']
- . ' = ?';
- $sub2 = 'SELECT '.$this->definition['local']
- . ' FROM '.$this->definition['refTable']->getTableName()
- . ' WHERE '.$this->definition['foreign']
- . ' = ?';
- $dql = 'FROM ' . $this->definition['table']->getComponentName()
- . '.' . $this->definition['refTable']->getComponentName()
- . ' WHERE ' . $this->definition['table']->getComponentName()
- . '.' . $identifier
- . ' IN (' . $sub . ')'
- . ' || ' . $this->definition['table']->getComponentName()
- . '.' . $identifier
- . ' IN (' . $sub2 . ')';
- $dql .= $this->getOrderBy($this->definition['table']->getComponentName(), false);
- break;
- case 'collection':
- $sub = substr(str_repeat('?, ', $count),0,-2);
- $dql = 'FROM '.$this->definition['refTable']->getComponentName()
- . '.' . $this->definition['table']->getComponentName()
- . ' WHERE '.$this->definition['refTable']->getComponentName()
- . '.' . $this->definition['local'] . ' IN (' . $sub . ')';
- $dql .= $this->getOrderBy($this->definition['refTable']->getComponentName(), false);
- };
- return $dql;
- }
- public function fetchRelatedFor(Doctrine_Record $record)
- {
- $id = $record->getIncremented();
- $q = new Doctrine_RawSql();
- $assocTable = $this->getAssociationFactory()->getTableName();
- $tableName = $record->getTable()->getTableName();
- $identifierColumnNames = $record->getTable()->getIdentifierColumnNames();
- $identifier = array_pop($identifierColumnNames);
- $sub = 'SELECT '.$this->getForeign().
- ' FROM '.$assocTable.
- ' WHERE '.$this->getLocal().
- ' = ?';
- $sub2 = 'SELECT '.$this->getLocal().
- ' FROM '.$assocTable.
- ' WHERE '.$this->getForeign().
- ' = ?';
- $q->select('{'.$tableName.'.*}, {'.$assocTable.'.*}')
- ->from($tableName . ' INNER JOIN '.$assocTable.' ON '.
- $tableName . '.' . $identifier . ' = ' . $assocTable . '.' . $this->getLocal() . ' OR ' .
- $tableName . '.' . $identifier . ' = ' . $assocTable . '.' . $this->getForeign()
- )
- ->where($tableName.'.'.$identifier.' IN ('.$sub.') OR '.
- $tableName.'.'.$identifier.' IN ('.$sub2.')'
- );
- $q->addComponent($tableName, $record->getTable()->getComponentName());
- $q->addComponent($assocTable, $record->getTable()->getComponentName(). '.' . $this->getAssociationFactory()->getComponentName());
- $q->orderBy($this->getOrderByStatement($tableName, true));
- return $q->execute(array($id, $id));
- }
- }