summaryrefslogtreecommitdiff
path: root/framework/Db/schema/TDbCriteria.php
diff options
context:
space:
mode:
authorChristophe.Boulain <>2009-06-15 07:49:42 +0000
committerChristophe.Boulain <>2009-06-15 07:49:42 +0000
commit3f0149b5b74d4017ba7f4ca28aa8a3e2053db964 (patch)
treec21232fbbd5218b826574458612557f59cf7e3c2 /framework/Db/schema/TDbCriteria.php
parentcb0f97438fe634c5a95179d47c78af04fffa751b (diff)
Primilary import of new db stuff
Diffstat (limited to 'framework/Db/schema/TDbCriteria.php')
-rwxr-xr-xframework/Db/schema/TDbCriteria.php166
1 files changed, 166 insertions, 0 deletions
diff --git a/framework/Db/schema/TDbCriteria.php b/framework/Db/schema/TDbCriteria.php
new file mode 100755
index 00000000..f6bbe7c3
--- /dev/null
+++ b/framework/Db/schema/TDbCriteria.php
@@ -0,0 +1,166 @@
+<?php
+/**
+ * TDbCriteria class file.
+ *
+ * @author Qiang Xue <qiang.xue@gmail.com>
+ * @link http://www.yiiframework.com/
+ * @copyright Copyright &copy; 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 <qiang.xue@gmail.com>
+ * @version $Id$
+ * @package system.db.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, <code>age>31 AND team=1</code>.
+ */
+ public $condition='';
+ /**
+ * @var array list of query parameter values indexed by parameter placeholders.
+ * For example, <code>array(':name'=>'Dan', ':age'=>31)</code>.
+ */
+ 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, <code>'projectID, teamID'</code>.
+ */
+ public $group='';
+ /**
+ * @var string how to join with other tables. This refers to the JOIN clause in an SQL statement.
+ * For example, <code>'LEFT JOIN users ON users.id=authorID'</code>.
+ */
+ public $join='';
+ /**
+ * @var string the condition to be applied with GROUP-BY clause.
+ * For example, <code>'SUM(revenue)<50000'</code>.
+ * @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;
+ }
+}