Source for file Nest.php

Documentation is available at Nest.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.         if (empty($id) || ! $this->definition['table']->getAttribute(Doctrine::ATTR_LOAD_REFERENCES)) {
  79.             return new Doctrine_Collection($this->getTable());
  80.         } else {
  81.             $q = new Doctrine_Query();
  82.             
  83.             $c  = $this->getTable()->getComponentName();
  84.             $a  = substr($c, 0, 1);
  85.             $c2 = $this->getAssociationTable()->getComponentName();
  86.             $a2 = substr($c2, 0, 1);
  87.  
  88.             $q->from($c)
  89.               ->innerJoin($c . '.' . $c2)
  90.  
  91.             $sub = 'SELECT ' . $this->getForeign() 
  92.                  . ' FROM '  . $c2
  93.                  . ' WHERE ' . $this->getLocal() 
  94.                  . ' = ?';
  95.         }
  96.     }
  97.     */
  98.  
  99.     public function fetchRelatedFor(Doctrine_Record $record)
  100.     {
  101.         $id $record->getIncremented();
  102.  
  103.  
  104.         if (empty($id|| $this->definition['table']->getAttribute(Doctrine::ATTR_LOAD_REFERENCES)) {
  105.             return new Doctrine_Collection($this->getTable());
  106.         else {
  107.             $q new Doctrine_RawSql();
  108.  
  109.             $assocTable $this->getAssociationFactory()->getTableName();
  110.             $tableName  $record->getTable()->getTableName();
  111.             $identifier $record->getTable()->getIdentifier();
  112.     
  113.             $sub 'SELECT ' $this->getForeign()
  114.                  . ' FROM ' $assocTable 
  115.                  . ' WHERE ' $this->getLocal(
  116.                  . ' = ?';
  117.  
  118.             $condition[$tableName '.' $identifier ' IN (' $sub ')';
  119.             $joinCondition[$tableName '.' $identifier ' = ' $assocTable '.' $this->getForeign();
  120.  
  121.             if ($this->definition['equal']{
  122.                 $sub2   'SELECT ' $this->getLocal()
  123.                         . ' FROM '  $assocTable
  124.                         . ' WHERE ' $this->getForeign()
  125.                         . ' = ?';
  126.  
  127.                 $condition[$tableName '.' $identifier ' IN (' $sub2 ')';
  128.                 $joinCondition[$tableName '.' $identifier ' = ' $assocTable '.' $this->getLocal();
  129.             }
  130.             $q->select('{'.$tableName.'.*}, {'.$assocTable.'.*}')
  131.               ->from($tableName ' INNER JOIN ' $assocTable ' ON ' implode(' OR '$joinCondition))
  132.               ->where(implode(' OR '$condition));
  133.             $q->addComponent($tableName,  $record->getTable()->getComponentName());
  134.             $q->addComponent($assocTable$record->getTable()->getComponentName()'.' $this->getAssociationFactory()->getComponentName());
  135.  
  136.             $params ($this->definition['equal']array($id$idarray($id);
  137.  
  138.             return $q->execute($params);
  139.         }
  140.     }
  141. }