Source for file Self.php

Documentation is available at Self.php

  1. <?php
  2. /*
  3.  *  $Id: Self.php 1434 2007-05-22 15:57:17Z zYne $
  4.  *
  5.  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  6.  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  7.  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  8.  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  9.  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  10.  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  11.  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  12.  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  13.  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  14.  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  15.  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  16.  *
  17.  * This software consists of voluntary contributions made by many individuals
  18.  * and is licensed under the LGPL. For more information, see
  19.  * <http://www.phpdoctrine.com>.
  20.  */
  21. Doctrine::autoload('Doctrine_Relation_Association');
  22. /**
  23.  * Doctrine_Relation_Association_Self
  24.  *
  25.  * @package     Doctrine
  26.  * @license     http://www.opensource.org/licenses/lgpl-license.php LGPL
  27.  * @category    Object Relational Mapping
  28.  * @link        www.phpdoctrine.com
  29.  * @since       1.0
  30.  * @version     $Revision: 1434 $
  31.  * @author      Konsta Vesterinen <kvesteri@cc.hut.fi>
  32.  */
  33. {
  34.     /**
  35.      * getRelationDql
  36.      *
  37.      * @param integer $count 
  38.      * @return string 
  39.      */
  40.     public function getRelationDql($count$context 'record')
  41.     {
  42.         switch ($context{
  43.             case 'record':
  44.                 $sub    'SELECT '.$this->definition['foreign'
  45.                         . ' FROM '.$this->definition['refTable']->getTableName()
  46.                         . ' WHERE '.$this->definition['local']
  47.                         . ' = ?';
  48.  
  49.                 $sub2   'SELECT '.$this->definition['local']
  50.                         . ' FROM '.$this->definition['refTable']->getTableName()
  51.                         . ' WHERE '.$this->definition['foreign']
  52.                         . ' = ?';
  53.  
  54.                 $dql  'FROM ' $this->definition['table']->getComponentName()
  55.                       . '.' $this->definition['refTable']->getComponentName()
  56.                       . ' WHERE ' $this->definition['table']->getComponentName()
  57.                       . '.' $this->definition['table']->getIdentifier(
  58.                       . ' IN (' $sub ')'
  59.                       . ' || ' $this->definition['table']->getComponentName(
  60.                       . '.' $this->definition['table']->getIdentifier(
  61.                       . ' IN (' $sub2 ')';
  62.                 break;
  63.             case 'collection':
  64.                 $sub  substr(str_repeat('?, '$count),0,-2);
  65.                 $dql  'FROM '.$this->definition['refTable']->getComponentName()
  66.                       . '.' $this->definition['table']->getComponentName()
  67.                       . ' WHERE '.$this->definition['refTable']->getComponentName()
  68.                       . '.' $this->definition['local'' IN (' $sub ')';
  69.         };
  70.  
  71.         return $dql;
  72.     }
  73.  
  74.     public function fetchRelatedFor(Doctrine_Record $record)
  75.     {
  76.         $id      $record->getIncremented();
  77.  
  78.         $q new Doctrine_RawSql();
  79.  
  80.         $assocTable $this->getAssociationFactory()->getTableName();
  81.         $tableName  $record->getTable()->getTableName();
  82.         $identifier $record->getTable()->getIdentifier();
  83.  
  84.         $sub     'SELECT '.$this->getForeign().
  85.                    ' FROM '.$assocTable.
  86.                    ' WHERE '.$this->getLocal().
  87.                    ' = ?';
  88.  
  89.         $sub2   'SELECT '.$this->getLocal().
  90.                   ' FROM '.$assocTable.
  91.                   ' WHERE '.$this->getForeign().
  92.                   ' = ?';
  93.  
  94.         $q->select('{'.$tableName.'.*}, {'.$assocTable.'.*}')
  95.           ->from($tableName ' INNER JOIN '.$assocTable.' ON '.
  96.                  $tableName '.' $identifier ' = ' $assocTable '.' $this->getLocal(' OR ' .
  97.                  $tableName '.' $identifier ' = ' $assocTable '.' $this->getForeign()
  98.                  )
  99.           ->where($tableName.'.'.$identifier.' IN ('.$sub.') OR '.
  100.                   $tableName.'.'.$identifier.' IN ('.$sub2.')'
  101.                 );
  102.         $q->addComponent($tableName,  $record->getTable()->getComponentName());
  103.         $q->addComponent($assocTable$record->getTable()->getComponentName()'.' $this->getAssociationFactory()->getComponentName());
  104.  
  105.         return $q->execute(array($id$id));
  106.     }
  107. }