* @link http://www.yiiframework.com/ * @copyright Copyright © 2008-2009 Yii Software LLC * @license http://www.yiiframework.com/license/ */ /** * TDbCriteria represents a query criteria, such as conditions, ordering by, limit/offset. * * @author Qiang Xue * @version $Id: TDbCriteria.php 2679 2009-06-15 07:49:42Z Christophe.Boulain $ * @package System.Testing.Data.schema * @since 1.0 */ class TDbCriteria { /** * @var mixed the columns being selected. This refers to the SELECT clause in an SQL * statement. The property can be either a string (column names separated by commas) * or an array of column names. Defaults to '*', meaning all columns. */ public $select='*'; /** * @var string query condition. This refers to the WHERE clause in an SQL statement. * For example, age>31 AND team=1. */ public $condition=''; /** * @var array list of query parameter values indexed by parameter placeholders. * For example, array(':name'=>'Dan', ':age'=>31). */ public $params=array(); /** * @var integer maximum number of records to be returned. If less than 0, it means no limit. */ public $limit=-1; /** * @var integer zero-based offset from where the records are to be returned. If less than 0, it means starting from the beginning. */ public $offset=-1; /** * @var string how to sort the query results. This refers to the ORDER BY clause in an SQL statement. */ public $order=''; /** * @var string how to group the query results. This refers to the GROUP BY clause in an SQL statement. * For example, 'projectID, teamID'. */ public $group=''; /** * @var string how to join with other tables. This refers to the JOIN clause in an SQL statement. * For example, 'LEFT JOIN users ON users.id=authorID'. */ public $join=''; /** * @var string the condition to be applied with GROUP-BY clause. * For example, 'SUM(revenue)<50000'. * @since 1.0.1 */ public $having=''; /** * Constructor. * @param array criteria initial property values (indexed by property name) */ public function __construct($data=array()) { foreach($data as $name=>$value) $this->$name=$value; } /** * Merges with another criteria. * In general, the merging makes the resulting criteria more restrictive. * For example, if both criterias have conditions, they will be 'AND' together. * Also, the criteria passed as the parameter takes precedence in case * two options cannot be merged (e.g. LIMIT, OFFSET). * @param TDbCriteria the criteria to be merged with. * @param boolean whether to use 'AND' to merge condition and having options. * If false, 'OR' will be used instead. Defaults to 'AND'. This parameter has been * available since version 1.0.6. * @since 1.0.5 */ public function mergeWith($criteria,$useAnd=true) { $and=$useAnd ? 'AND' : 'OR'; if(is_array($criteria)) $criteria=new self($criteria); if($this->select!==$criteria->select) { if($this->select==='*') $this->select=$criteria->select; else if($criteria->select!=='*') { $select1=is_string($this->select)?preg_split('/\s*,\s*/',trim($this->select),-1,PREG_SPLIT_NO_EMPTY):$this->select; $select2=is_string($criteria->select)?preg_split('/\s*,\s*/',trim($criteria->select),-1,PREG_SPLIT_NO_EMPTY):$criteria->select; $this->select=array_merge($select1,array_diff($select2,$select1)); } } if($this->condition!==$criteria->condition) { if($this->condition==='') $this->condition=$criteria->condition; else if($criteria->condition!=='') $this->condition="({$this->condition}) $and ({$criteria->condition})"; } if($this->params!==$criteria->params) $this->params=array_merge($this->params,$criteria->params); if($criteria->limit>0) $this->limit=$criteria->limit; if($criteria->offset>=0) $this->offset=$criteria->offset; if($this->order!==$criteria->order) { if($this->order==='') $this->order=$criteria->order; else if($criteria->order!=='') $this->order.=', '.$criteria->order; } if($this->group!==$criteria->group) { if($this->group==='') $this->group=$criteria->group; else if($criteria->group!=='') $this->group.=', '.$criteria->group; } if($this->join!==$criteria->join) { if($this->join==='') $this->join=$criteria->join; else if($criteria->join!=='') $this->join.=' '.$criteria->join; } if($this->having!==$criteria->having) { if($this->having==='') $this->having=$criteria->having; else if($criteria->having!=='') $this->having="({$this->having}) $and ({$criteria->having})"; } } /** * @return array the array representation of the criteria * @since 1.0.6 */ public function toArray() { $result=array(); foreach(array('select', 'condition', 'params', 'limit', 'offset', 'order', 'group', 'join', 'having') as $name) $result[$name]=$this->$name; return $result; } }