Source for file lmbARQuery.class.php

Documentation is available at lmbARQuery.class.php

  1. <?php
  2. /*
  3.  * Limb PHP Framework
  4.  *
  5.  * @link http://limb-project.com
  6.  * @copyright  Copyright &copy; 2004-2007 BIT(http://bit-creative.com)
  7.  * @license    LGPL http://www.gnu.org/copyleft/lesser.html
  8.  */
  9. lmb_require('limb/dbal/src/query/lmbSelectRawQuery.class.php');
  10. lmb_require('limb/active_record/src/lmbARRecordSetAttachDecorator.class.php');
  11. lmb_require('limb/active_record/src/lmbARRecordSetJoinDecorator.class.php');
  12.  
  13. class lmbARQuery extends lmbSelectRawQuery
  14. {
  15.   protected $base_class_name;
  16.   protected $base_object;
  17.   protected $join_relations = array();
  18.   protected $attach_relations = array();
  19.   protected $sort_params = array();
  20.   
  21.   function __construct($base_class_name_or_obj$conn$sql ''$magic_params array())
  22.   {
  23.     if(is_object($base_class_name_or_obj))
  24.     {
  25.       $this->base_class_name = get_class($base_class_name_or_obj);
  26.       $this->base_object = $base_class_name_or_obj;
  27.     }
  28.     else
  29.     {
  30.       $this->base_class_name = $base_class_name_or_obj;
  31.       $this->base_object = new $this->base_class_name(null$conn);
  32.     }
  33.  
  34.     if(!$sql)
  35.     {
  36.       parent :: __construct($conn);
  37.       $this->addTable($this->base_object->getTableName());
  38.       $this->_addFieldsForObject($this->base_object''''$magic_params);
  39.     }
  40.     else
  41.     {
  42.       parent :: __construct($sql$conn);
  43.     }
  44.   }
  45.   
  46.   function eagerJoin($relation_name$params array())
  47.   {
  48.     $this->join_relations[$relation_name$params;
  49.     return $this;
  50.   }
  51.  
  52.   //should be removed before release
  53.   function joinRelation($relation_name$params array())
  54.   {
  55.     return $this->eagerJoin($relation_name$params);
  56.   }
  57.   
  58.   function eagerAttach($relation_name$params array())
  59.   {
  60.     $this->attach_relations[$relation_name$params;
  61.     return $this;
  62.   }
  63.   
  64.   //should be removed before release
  65.   function attachRelation($relation_name$params array())
  66.   {
  67.     return $this->eagerAttach($relation_name$params);
  68.   }
  69.   
  70.   protected function _addFieldsForObject($object$table_name ''$prefix ''$magic_params array())
  71.   {
  72.     if(isset($magic_params['fields']&& is_array($magic_params['fields']))
  73.       $object->setLazyAttributesExcept($magic_params['fields']);
  74.  
  75.     $lazy_attributes $object->getLazyAttributes();
  76.     
  77.     if(isset($magic_params['with_lazy_attributes']))
  78.     {
  79.       if(!is_array($magic_params['with_lazy_attributes']))
  80.         $lazy_attributes array();
  81.       else
  82.         $lazy_attributes array_diff($lazy_attributes$magic_params['with_lazy_attributes']);
  83.     }
  84.     
  85.     $fields $object->getDbTable()->getColumnsForSelect($table_name$lazy_attributes$prefix);
  86.     foreach($fields as $field => $alias)
  87.       $this->addField($field$alias);
  88.   }
  89.   
  90.   function addOrder($field$type='ASC')
  91.   {
  92.     if(is_array($field))
  93.       $this->sort_params = $this->sort_params + $field;
  94.     else
  95.       $this->sort_params[$field$type;
  96.   }
  97.   
  98.   function getRecordSet()
  99.   {
  100.     $rs parent :: getRecordSet();
  101.     $rs->sort($this->sort_params);
  102.     return $rs;
  103.   }
  104.   
  105.   function fetch($decorate true)
  106.   {
  107.     $this->_applyJoins($this->base_object$this->join_relations);
  108.     
  109.     $rs parent :: fetch();
  110.  
  111.     if($decorate)
  112.       $rs new lmbARRecordSetDecorator($rs$this->base_class_name$this->_conn$this->base_object->getLazyAttributes());
  113.     
  114.     $rs $this->_decorateWithJoinDecorator($rs);
  115.     
  116.     $rs =  $this->_decorateWithAttachDecorator($rs);
  117.     
  118.     $rs->sort($this->sort_params);
  119.     
  120.     return $rs;
  121.   }
  122.   
  123.   protected function _applyJoins($base_object$joins$parent_relation_name '')
  124.   {
  125.     if(is_string($joins))
  126.       $joins array($joins => array());
  127.     
  128.     if($parent_relation_name)
  129.       $prefix $parent_relation_name '__';
  130.     else
  131.     {
  132.       $parent_relation_name $base_object->getTableName();
  133.       $prefix '';
  134.     }
  135.     
  136.     foreach($joins as $relation_name => $params)
  137.     {
  138.       $relation_info $base_object->getRelationInfo($relation_name);
  139.       
  140.       if(!$relation_info || !isset($relation_info['class']))
  141.         throw new lmbException('Relation info "' $relation_name .'" not found in "' get_class($base_object'" or does not contain "class" property');
  142.       
  143.       $class_name $relation_info['class'];
  144.       $object new $class_name(null$this->_conn);
  145.       $this->_addFieldsForObject($object$prefix $relation_name$prefix $relation_name '__'$params);
  146.       
  147.       $relation_type $base_object->getRelationType($relation_name);
  148.       switch($relation_type)
  149.       {
  150.         case lmbActiveRecord :: HAS_ONE:
  151.         case lmbActiveRecord :: MANY_BELONGS_TO:
  152.           $this->addLeftJoin($object->getTableName()
  153.                              $object->getPrimaryKeyName(),
  154.                              $parent_relation_name
  155.                              $relation_info['field'],
  156.                              $prefix $relation_name);
  157.         break;
  158.         case lmbActiveRecord :: BELONGS_TO:
  159.           $this->addLeftJoin($object->getTableName()
  160.                              $relation_info['field'],
  161.                              $parent_relation_name
  162.                              $base_object->getPrimaryKeyName(),
  163.                              $prefix $relation_name);
  164.         break;
  165.         default:
  166.            throw new lmbARException('"' $relation_name '" has a wrong relation type for JOIN operation');
  167.         break;
  168.       }
  169.       
  170.       if(isset($params['join']))
  171.         $this->_applyJoins($object$params['join']$prefix $relation_name);
  172.     }
  173.   }
  174.  
  175.   protected function _decorateWithJoinDecorator($rs)
  176.   {
  177.     if(count($this->join_relations))
  178.       return new lmbARRecordSetJoinDecorator($rs$this->base_object$this->_conn$this->join_relations);
  179.     else
  180.       return $rs;
  181.   }
  182.   
  183.   protected function _decorateWithAttachDecorator($rs)
  184.   {
  185.     if(count($this->attach_relations))
  186.       return new lmbARRecordSetAttachDecorator($rs$this->base_object$this->_conn$this->attach_relations);
  187.     else
  188.       return $rs;
  189.   }
  190.   
  191.   static function create($class_name$params array()$conn null$sql '')
  192.   {
  193.     if(!$conn)
  194.       $conn lmbToolkit :: instance()->getDefaultDbConnection();
  195.     
  196.     $object new $class_name;
  197.     $query new lmbARQuery($class_name$conn$sql$params);
  198.  
  199.     if(isset($params['criteria']&& $params['criteria'])
  200.       $criteria lmbSQLCriteria :: objectify($params['criteria'])
  201.     else
  202.       $criteria lmbSQLCriteria :: create();
  203.  
  204.     $has_class_criteria false;
  205.     if(isset($params['class']))
  206.     {
  207.       $filter_object new $params['class'];
  208.       $criteria $filter_object->addClassCriteria($criteria);
  209.       $has_class_criteria true;
  210.     }
  211.  
  212.     if(!$has_class_criteria)
  213.       $object->addClassCriteria($criteria);
  214.     
  215.     $query->where($criteria);
  216.     
  217.     $sort_params (isset($params['sort']&& $params['sort']$params['sort'$object->getDefaultSortParams();
  218.     $query->order($sort_params);
  219.  
  220.     if(isset($params['group']&& $params['group'])
  221.         $query->group($params['group']);
  222.     
  223.     $join (isset($params['join']&& $params['join']$params['join'array();
  224.     if(!is_array($join))
  225.       $join explode(','$join);
  226.     
  227.     foreach($join as $relation_name=> $params_or_relation_name)
  228.     {
  229.       if(is_numeric($relation_name))
  230.         $query->eagerJoin(trim($params_or_relation_name));
  231.       else
  232.         $query->eagerJoin(trim($relation_name)$params_or_relation_name);
  233.     }
  234.  
  235.     $attach (isset($params['attach']&& $params['attach']$params['attach'array();
  236.     if(!is_array($attach))
  237.       $attach explode(','$attach);
  238.     
  239.     foreach($attach as $relation_name => $params_or_relation_name)
  240.     {
  241.       if(is_numeric($relation_name))
  242.         $query->eagerAttach(trim($params_or_relation_name));
  243.       else
  244.         $query->eagerAttach(trim($relation_name)$params_or_relation_name);
  245.     }
  246.     
  247.     return $query;
  248.   }
  249. }

Documentation generated on Wed, 07 Jan 2009 03:47:22 +0300 by phpDocumentor 1.3.2