Query.php 20.7 KB
Newer Older
w  
Qiang Xue committed
1 2 3 4 5
<?php
/**
 * Query class file.
 *
 * @link http://www.yiiframework.com/
Qiang Xue committed
6
 * @copyright Copyright &copy; 2008 Yii Software LLC
w  
Qiang Xue committed
7 8 9
 * @license http://www.yiiframework.com/license/
 */

Qiang Xue committed
10
namespace yii\db;
w  
Qiang Xue committed
11 12

/**
Qiang Xue committed
13
 * Query represents a SELECT SQL statement in a way that is independent of DBMS.
Qiang Xue committed
14
 *
Qiang Xue committed
15 16
 * Query provides a set of methods to facilitate the specification of different clauses
 * in a SELECT statement. These methods can be chained together.
Qiang Xue committed
17
 *
Qiang Xue committed
18 19 20 21
 * By calling [[createCommand()]], we can get a [[Command]] instance which can be further
 * used to perform/execute the DB query against a database.
 *
 * For example,
Qiang Xue committed
22 23 24 25 26 27
 *
 * ~~~
 * $query = new Query;
 * $query->select('id, name')
 *     ->from('tbl_user')
 *     ->limit(10);
Qiang Xue committed
28
 * // build and execute the query
Qiang Xue committed
29 30 31
 * $command = $query->createCommand();
 * // $command->sql returns the actual SQL
 * $rows = $command->queryAll();
Qiang Xue committed
32 33
 * ~~~
 *
w  
Qiang Xue committed
34 35 36
 * @author Qiang Xue <qiang.xue@gmail.com>
 * @since 2.0
 */
Qiang Xue committed
37
class Query extends \yii\base\Component
w  
Qiang Xue committed
38
{
Qiang Xue committed
39
	/**
Qiang Xue committed
40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
	 * @var string|array the columns being selected. This refers to the SELECT clause in a SQL
	 * statement. It can be either a string (e.g. `'id, name'`) or an array (e.g. `array('id', 'name')`).
	 * If not set, if means all columns.
	 * @see select()
	 */
	public $select;
	/**
	 * @var string additional option that should be appended to the 'SELECT' keyword. For example,
	 * in MySQL, the option 'SQL_CALC_FOUND_ROWS' can be used.
	 */
	public $selectOption;
	/**
	 * @var boolean whether to select distinct rows of data only. If this is set true,
	 * the SELECT clause would be changed to SELECT DISTINCT.
	 */
	public $distinct;
	/**
	 * @var string|array the table(s) to be selected from. This refers to the FROM clause in a SQL statement.
	 * It can be either a string (e.g. `'tbl_user, tbl_post'`) or an array (e.g. `array('tbl_user', 'tbl_post')`).
	 * @see from()
	 */
	public $from;
	/**
	 * @var string|array query condition. This refers to the WHERE clause in a SQL statement.
	 * For example, `age > 31 AND team = 1`.
	 * @see where()
	 */
	public $where;
	/**
	 * @var integer maximum number of records to be returned. If not set or less than 0, it means no limit.
	 */
	public $limit;
	/**
	 * @var integer zero-based offset from where the records are to be returned. If not set or
	 * less than 0, it means starting from the beginning.
	 */
	public $offset;
	/**
	 * @var string|array how to sort the query results. This refers to the ORDER BY clause in a SQL statement.
	 * It can be either a string (e.g. `'id ASC, name DESC'`) or an array (e.g. `array('id ASC', 'name DESC')`).
Qiang Xue committed
80
	 */
Qiang Xue committed
81
	public $orderBy;
Qiang Xue committed
82
	/**
Qiang Xue committed
83 84
	 * @var string|array how to group the query results. This refers to the GROUP BY clause in a SQL statement.
	 * It can be either a string (e.g. `'company, department'`) or an array (e.g. `array('company', 'department')`).
Qiang Xue committed
85
	 */
Qiang Xue committed
86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
	public $groupBy;
	/**
	 * @var string|array how to join with other tables. This refers to the JOIN clause in a SQL statement.
	 * It can be either a string (e.g. `'LEFT JOIN tbl_user ON tbl_user.id=author_id'`) or an array (e.g.
	 * `array('LEFT JOIN tbl_user ON tbl_user.id=author_id', 'LEFT JOIN tbl_team ON tbl_team.id=team_id')`).
	 * @see join()
	 */
	public $join;
	/**
	 * @var string|array the condition to be applied in the GROUP BY clause.
	 * It can be either a string or an array. Please refer to [[where()]] on how to specify the condition.
	 */
	public $having;
	/**
	 * @var string|Query[] the UNION clause(s) in a SQL statement. This can be either a string
	 * representing a single UNION clause or an array representing multiple UNION clauses.
	 * Each union clause can be a string or a `Query` object which refers to the SQL statement.
	 */
	public $union;
	/**
	 * @var array list of query parameter values indexed by parameter placeholders.
	 * For example, `array(':name'=>'Dan', ':age'=>31)`.
	 */
	public $params;
Qiang Xue committed
110 111

	/**
Qiang Xue committed
112 113
	 * Creates a DB command that can be used to execute this query.
	 * @param Connection $db the database connection used to generate the SQL statement.
Qiang Xue committed
114
	 * If this parameter is not given, the `db` application component will be used.
Qiang Xue committed
115
	 * @return Command the created DB command instance.
Qiang Xue committed
116
	 */
Qiang Xue committed
117
	public function createCommand($db = null)
Qiang Xue committed
118
	{
Qiang Xue committed
119
		if ($db === null) {
Qiang Xue committed
120
			$db = \Yii::$app->db;
Qiang Xue committed
121
		}
Qiang Xue committed
122 123
		$sql = $db->getQueryBuilder()->build($this);
		return $db->createCommand($sql, $this->params);
Qiang Xue committed
124 125 126
	}

	/**
Qiang Xue committed
127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237
	 * Sets the SELECT part of the query.
	 * @param string|array $columns the columns to be selected.
	 * Columns can be specified in either a string (e.g. "id, name") or an array (e.g. array('id', 'name')).
	 * Columns can contain table prefixes (e.g. "tbl_user.id") and/or column aliases (e.g. "tbl_user.id AS user_id").
	 * The method will automatically quote the column names unless a column contains some parenthesis
	 * (which means the column contains a DB expression).
	 * @param string $option additional option that should be appended to the 'SELECT' keyword. For example,
	 * in MySQL, the option 'SQL_CALC_FOUND_ROWS' can be used.
	 * @return Query the query object itself
	 */
	public function select($columns, $option = null)
	{
		$this->select = $columns;
		$this->selectOption = $option;
		return $this;
	}

	/**
	 * Sets the value indicating whether to SELECT DISTINCT or not.
	 * @param bool $value whether to SELECT DISTINCT or not.
	 * @return Query the query object itself
	 */
	public function distinct($value = true)
	{
		$this->distinct = $value;
		return $this;
	}

	/**
	 * Sets the FROM part of the query.
	 * @param string|array $tables the table(s) to be selected from. This can be either a string (e.g. `'tbl_user'`)
	 * or an array (e.g. `array('tbl_user', 'tbl_profile')`) specifying one or several table names.
	 * Table names can contain schema prefixes (e.g. `'public.tbl_user'`) and/or table aliases (e.g. `'tbl_user u'`).
	 * The method will automatically quote the table names unless it contains some parenthesis
	 * (which means the table is given as a sub-query or DB expression).
	 * @return Query the query object itself
	 */
	public function from($tables)
	{
		$this->from = $tables;
		return $this;
	}

	/**
	 * Sets the WHERE part of the query.
	 *
	 * The method requires a $condition parameter, and optionally a $params parameter
	 * specifying the values to be bound to the query.
	 *
	 * The $condition parameter should be either a string (e.g. 'id=1') or an array.
	 * If the latter, it must be in one of the following two formats:
	 *
	 * - hash format: `array('column1' => value1, 'column2' => value2, ...)`
	 * - operator format: `array(operator, operand1, operand2, ...)`
	 *
	 * A condition in hash format represents the following SQL expression in general:
	 * `column1=value1 AND column2=value2 AND ...`. In case when a value is an array,
	 * an `IN` expression will be generated. And if a value is null, `IS NULL` will be used
	 * in the generated expression. Below are some examples:
	 *
	 * - `array('type'=>1, 'status'=>2)` generates `(type=1) AND (status=2)`.
	 * - `array('id'=>array(1,2,3), 'status'=>2)` generates `(id IN (1,2,3)) AND (status=2)`.
	 * - `array('status'=>null) generates `status IS NULL`.
	 *
	 * A condition in operator format generates the SQL expression according to the specified operator, which
	 * can be one of the followings:
	 *
	 * - `and`: the operands should be concatenated together using `AND`. For example,
	 * `array('and', 'id=1', 'id=2')` will generate `id=1 AND id=2`. If an operand is an array,
	 * it will be converted into a string using the rules described here. For example,
	 * `array('and', 'type=1', array('or', 'id=1', 'id=2'))` will generate `type=1 AND (id=1 OR id=2)`.
	 * The method will NOT do any quoting or escaping.
	 *
	 * - `or`: similar to the `and` operator except that the operands are concatenated using `OR`.
	 *
	 * - `between`: operand 1 should be the column name, and operand 2 and 3 should be the
	 * starting and ending values of the range that the column is in.
	 * For example, `array('between', 'id', 1, 10)` will generate `id BETWEEN 1 AND 10`.
	 *
	 * - `not between`: similar to `between` except the `BETWEEN` is replaced with `NOT BETWEEN`
	 * in the generated condition.
	 *
	 * - `in`: operand 1 should be a column or DB expression, and operand 2 be an array representing
	 * the range of the values that the column or DB expression should be in. For example,
	 * `array('in', 'id', array(1,2,3))` will generate `id IN (1,2,3)`.
	 * The method will properly quote the column name and escape values in the range.
	 *
	 * - `not in`: similar to the `in` operator except that `IN` is replaced with `NOT IN` in the generated condition.
	 *
	 * - `like`: operand 1 should be a column or DB expression, and operand 2 be a string or an array representing
	 * the values that the column or DB expression should be like.
	 * For example, `array('like', 'name', '%tester%')` will generate `name LIKE '%tester%'`.
	 * When the value range is given as an array, multiple `LIKE` predicates will be generated and concatenated
	 * using `AND`. For example, `array('like', 'name', array('%test%', '%sample%'))` will generate
	 * `name LIKE '%test%' AND name LIKE '%sample%'`.
	 * The method will properly quote the column name and escape values in the range.
	 *
	 * - `or like`: similar to the `like` operator except that `OR` is used to concatenate the `LIKE`
	 * predicates when operand 2 is an array.
	 *
	 * - `not like`: similar to the `like` operator except that `LIKE` is replaced with `NOT LIKE`
	 * in the generated condition.
	 *
	 * - `or not like`: similar to the `not like` operator except that `OR` is used to concatenate
	 * the `NOT LIKE` predicates.
	 *
	 * @param string|array $condition the conditions that should be put in the WHERE part.
	 * @param array $params the parameters (name=>value) to be bound to the query.
	 * @return Query the query object itself
	 * @see andWhere()
	 * @see orWhere()
Qiang Xue committed
238
	 */
Qiang Xue committed
239
	public function where($condition, $params = array())
Qiang Xue committed
240
	{
Qiang Xue committed
241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261
		$this->where = $condition;
		$this->addParams($params);
		return $this;
	}

	/**
	 * Adds an additional WHERE condition to the existing one.
	 * The new condition and the existing one will be joined using the 'AND' operator.
	 * @param string|array $condition the new WHERE condition. Please refer to [[where()]]
	 * on how to specify this parameter.
	 * @param array $params the parameters (name=>value) to be bound to the query.
	 * @return Query the query object itself
	 * @see where()
	 * @see orWhere()
	 */
	public function andWhere($condition, $params = array())
	{
		if ($this->where === null) {
			$this->where = $condition;
		} else {
			$this->where = array('and', $this->where, $condition);
Qiang Xue committed
262
		}
Qiang Xue committed
263 264
		$this->addParams($params);
		return $this;
Qiang Xue committed
265 266
	}

Qiang Xue committed
267
	/**
Qiang Xue committed
268 269 270 271 272
	 * Adds an additional WHERE condition to the existing one.
	 * The new condition and the existing one will be joined using the 'OR' operator.
	 * @param string|array $condition the new WHERE condition. Please refer to [[where()]]
	 * on how to specify this parameter.
	 * @param array $params the parameters (name=>value) to be bound to the query.
Qiang Xue committed
273
	 * @return Query the query object itself
Qiang Xue committed
274 275
	 * @see where()
	 * @see andWhere()
Qiang Xue committed
276
	 */
Qiang Xue committed
277
	public function orWhere($condition, $params = array())
Qiang Xue committed
278
	{
Qiang Xue committed
279 280 281 282 283 284
		if ($this->where === null) {
			$this->where = $condition;
		} else {
			$this->where = array('or', $this->where, $condition);
		}
		$this->addParams($params);
Qiang Xue committed
285 286 287 288
		return $this;
	}

	/**
Qiang Xue committed
289 290 291 292 293 294 295 296
	 * Appends a JOIN part to the query.
	 * The first parameter specifies what type of join it is.
	 * @param string $type the type of join, such as INNER JOIN, LEFT JOIN.
	 * @param string $table the table to be joined.
	 * Table name can contain schema prefix (e.g. 'public.tbl_user') and/or table alias (e.g. 'tbl_user u').
	 * The method will automatically quote the table name unless it contains some parenthesis
	 * (which means the table is given as a sub-query or DB expression).
	 * @param string|array $on the join condition that should appear in the ON part.
Qiang Xue committed
297
	 * Please refer to [[where()]] on how to specify this parameter.
Qiang Xue committed
298
	 * @param array $params the parameters (name=>value) to be bound to the query.
Qiang Xue committed
299 300
	 * @return Query the query object itself
	 */
Qiang Xue committed
301
	public function join($type, $table, $on = '', $params = array())
Qiang Xue committed
302
	{
Qiang Xue committed
303 304
		$this->join[] = array($type, $table, $on);
		return $this->addParams($params);
Qiang Xue committed
305 306 307
	}

	/**
Qiang Xue committed
308 309 310 311 312 313
	 * Appends an INNER JOIN part to the query.
	 * @param string $table the table to be joined.
	 * Table name can contain schema prefix (e.g. 'public.tbl_user') and/or table alias (e.g. 'tbl_user u').
	 * The method will automatically quote the table name unless it contains some parenthesis
	 * (which means the table is given as a sub-query or DB expression).
	 * @param string|array $on the join condition that should appear in the ON part.
Qiang Xue committed
314
	 * Please refer to [[where()]] on how to specify this parameter.
Qiang Xue committed
315
	 * @param array $params the parameters (name=>value) to be bound to the query.
Qiang Xue committed
316 317
	 * @return Query the query object itself
	 */
Qiang Xue committed
318
	public function innerJoin($table, $on = '', $params = array())
Qiang Xue committed
319
	{
Qiang Xue committed
320 321
		$this->join[] = array('INNER JOIN', $table, $on);
		return $this->addParams($params);
Qiang Xue committed
322 323 324
	}

	/**
Qiang Xue committed
325 326 327 328 329 330 331 332
	 * Appends a LEFT OUTER JOIN part to the query.
	 * @param string $table the table to be joined.
	 * Table name can contain schema prefix (e.g. 'public.tbl_user') and/or table alias (e.g. 'tbl_user u').
	 * The method will automatically quote the table name unless it contains some parenthesis
	 * (which means the table is given as a sub-query or DB expression).
	 * @param string|array $on the join condition that should appear in the ON part.
	 * Please refer to [[where()]] on how to specify this parameter.
	 * @param array $params the parameters (name=>value) to be bound to the query
Qiang Xue committed
333 334
	 * @return Query the query object itself
	 */
Qiang Xue committed
335
	public function leftJoin($table, $on = '', $params = array())
Qiang Xue committed
336
	{
Qiang Xue committed
337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369
		$this->join[] = array('LEFT JOIN', $table, $on);
		return $this->addParams($params);
	}

	/**
	 * Appends a RIGHT OUTER JOIN part to the query.
	 * @param string $table the table to be joined.
	 * Table name can contain schema prefix (e.g. 'public.tbl_user') and/or table alias (e.g. 'tbl_user u').
	 * The method will automatically quote the table name unless it contains some parenthesis
	 * (which means the table is given as a sub-query or DB expression).
	 * @param string|array $on the join condition that should appear in the ON part.
	 * Please refer to [[where()]] on how to specify this parameter.
	 * @param array $params the parameters (name=>value) to be bound to the query
	 * @return Query the query object itself
	 */
	public function rightJoin($table, $on = '', $params = array())
	{
		$this->join[] = array('RIGHT JOIN', $table, $on);
		return $this->addParams($params);
	}

	/**
	 * Sets the GROUP BY part of the query.
	 * @param string|array $columns the columns to be grouped by.
	 * Columns can be specified in either a string (e.g. "id, name") or an array (e.g. array('id', 'name')).
	 * The method will automatically quote the column names unless a column contains some parenthesis
	 * (which means the column contains a DB expression).
	 * @return Query the query object itself
	 * @see addGroup()
	 */
	public function groupBy($columns)
	{
		$this->groupBy = $columns;
Qiang Xue committed
370 371 372 373
		return $this;
	}

	/**
Qiang Xue committed
374 375 376 377 378
	 * Adds additional group-by columns to the existing ones.
	 * @param string|array $columns additional columns to be grouped by.
	 * Columns can be specified in either a string (e.g. "id, name") or an array (e.g. array('id', 'name')).
	 * The method will automatically quote the column names unless a column contains some parenthesis
	 * (which means the column contains a DB expression).
Qiang Xue committed
379
	 * @return Query the query object itself
Qiang Xue committed
380
	 * @see group()
Qiang Xue committed
381
	 */
Qiang Xue committed
382
	public function addGroup($columns)
Qiang Xue committed
383
	{
Qiang Xue committed
384 385 386 387 388 389 390 391 392 393 394
		if (empty($this->groupBy)) {
			$this->groupBy = $columns;
		} else {
			if (!is_array($this->groupBy)) {
				$this->groupBy = preg_split('/\s*,\s*/', trim($this->groupBy), -1, PREG_SPLIT_NO_EMPTY);
			}
			if (!is_array($columns)) {
				$columns = preg_split('/\s*,\s*/', trim($columns), -1, PREG_SPLIT_NO_EMPTY);
			}
			$this->groupBy = array_merge($this->groupBy, $columns);
		}
Qiang Xue committed
395 396 397 398
		return $this;
	}

	/**
Qiang Xue committed
399 400 401 402
	 * Sets the HAVING part of the query.
	 * @param string|array $condition the conditions to be put after HAVING.
	 * Please refer to [[where()]] on how to specify this parameter.
	 * @param array $params the parameters (name=>value) to be bound to the query.
Qiang Xue committed
403
	 * @return Query the query object itself
Qiang Xue committed
404 405
	 * @see andHaving()
	 * @see orHaving()
Qiang Xue committed
406
	 */
Qiang Xue committed
407
	public function having($condition, $params = array())
Qiang Xue committed
408
	{
Qiang Xue committed
409 410
		$this->having = $condition;
		$this->addParams($params);
Qiang Xue committed
411
		return $this;
w  
Qiang Xue committed
412 413
	}

Qiang Xue committed
414
	/**
Qiang Xue committed
415 416 417 418 419
	 * Adds an additional HAVING condition to the existing one.
	 * The new condition and the existing one will be joined using the 'AND' operator.
	 * @param string|array $condition the new HAVING condition. Please refer to [[where()]]
	 * on how to specify this parameter.
	 * @param array $params the parameters (name=>value) to be bound to the query.
Qiang Xue committed
420
	 * @return Query the query object itself
Qiang Xue committed
421 422
	 * @see having()
	 * @see orHaving()
Qiang Xue committed
423
	 */
Qiang Xue committed
424
	public function andHaving($condition, $params = array())
Qiang Xue committed
425
	{
Qiang Xue committed
426 427 428 429 430 431
		if ($this->having === null) {
			$this->having = $condition;
		} else {
			$this->having = array('and', $this->having, $condition);
		}
		$this->addParams($params);
Qiang Xue committed
432 433 434 435
		return $this;
	}

	/**
Qiang Xue committed
436 437 438 439 440
	 * Adds an additional HAVING condition to the existing one.
	 * The new condition and the existing one will be joined using the 'OR' operator.
	 * @param string|array $condition the new HAVING condition. Please refer to [[where()]]
	 * on how to specify this parameter.
	 * @param array $params the parameters (name=>value) to be bound to the query.
Qiang Xue committed
441
	 * @return Query the query object itself
Qiang Xue committed
442 443
	 * @see having()
	 * @see andHaving()
Qiang Xue committed
444
	 */
Qiang Xue committed
445
	public function orHaving($condition, $params = array())
Qiang Xue committed
446
	{
Qiang Xue committed
447 448 449 450 451 452
		if ($this->having === null) {
			$this->having = $condition;
		} else {
			$this->having = array('or', $this->having, $condition);
		}
		$this->addParams($params);
Qiang Xue committed
453 454 455 456
		return $this;
	}

	/**
Qiang Xue committed
457 458 459 460 461
	 * Sets the ORDER BY part of the query.
	 * @param string|array $columns the columns (and the directions) to be ordered by.
	 * Columns can be specified in either a string (e.g. "id ASC, name DESC") or an array (e.g. array('id ASC', 'name DESC')).
	 * The method will automatically quote the column names unless a column contains some parenthesis
	 * (which means the column contains a DB expression).
Qiang Xue committed
462
	 * @return Query the query object itself
Qiang Xue committed
463
	 * @see addOrder()
Qiang Xue committed
464
	 */
Qiang Xue committed
465
	public function orderBy($columns)
Qiang Xue committed
466
	{
Qiang Xue committed
467
		$this->orderBy = $columns;
Qiang Xue committed
468 469 470 471
		return $this;
	}

	/**
Qiang Xue committed
472 473 474 475 476
	 * Adds additional ORDER BY columns to the query.
	 * @param string|array $columns the columns (and the directions) to be ordered by.
	 * Columns can be specified in either a string (e.g. "id ASC, name DESC") or an array (e.g. array('id ASC', 'name DESC')).
	 * The method will automatically quote the column names unless a column contains some parenthesis
	 * (which means the column contains a DB expression).
Qiang Xue committed
477
	 * @return Query the query object itself
Qiang Xue committed
478
	 * @see order()
Qiang Xue committed
479
	 */
Qiang Xue committed
480
	public function addOrderBy($columns)
Qiang Xue committed
481
	{
Qiang Xue committed
482 483 484 485 486 487 488 489 490 491 492
		if (empty($this->orderBy)) {
			$this->orderBy = $columns;
		} else {
			if (!is_array($this->orderBy)) {
				$this->orderBy = preg_split('/\s*,\s*/', trim($this->orderBy), -1, PREG_SPLIT_NO_EMPTY);
			}
			if (!is_array($columns)) {
				$columns = preg_split('/\s*,\s*/', trim($columns), -1, PREG_SPLIT_NO_EMPTY);
			}
			$this->orderBy = array_merge($this->orderBy, $columns);
		}
Qiang Xue committed
493 494 495 496
		return $this;
	}

	/**
Qiang Xue committed
497 498
	 * Sets the LIMIT part of the query.
	 * @param integer $limit the limit
Qiang Xue committed
499 500
	 * @return Query the query object itself
	 */
Qiang Xue committed
501
	public function limit($limit)
Qiang Xue committed
502
	{
Qiang Xue committed
503
		$this->limit = $limit;
Qiang Xue committed
504 505 506 507
		return $this;
	}

	/**
Qiang Xue committed
508 509
	 * Sets the OFFSET part of the query.
	 * @param integer $offset the offset
Qiang Xue committed
510 511
	 * @return Query the query object itself
	 */
Qiang Xue committed
512
	public function offset($offset)
Qiang Xue committed
513
	{
Qiang Xue committed
514
		$this->offset = $offset;
Qiang Xue committed
515 516 517 518
		return $this;
	}

	/**
Qiang Xue committed
519 520
	 * Appends a SQL statement using UNION operator.
	 * @param string|Query $sql the SQL statement to be appended using UNION
Qiang Xue committed
521 522
	 * @return Query the query object itself
	 */
Qiang Xue committed
523
	public function union($sql)
Qiang Xue committed
524
	{
Qiang Xue committed
525
		$this->union[] = $sql;
Qiang Xue committed
526 527 528 529
		return $this;
	}

	/**
Qiang Xue committed
530 531 532
	 * Sets the parameters to be bound to the query.
	 * @param array $params list of query parameter values indexed by parameter placeholders.
	 * For example, `array(':name'=>'Dan', ':age'=>31)`.
Qiang Xue committed
533
	 * @return Query the query object itself
Qiang Xue committed
534
	 * @see addParams()
Qiang Xue committed
535
	 */
Qiang Xue committed
536
	public function params($params)
Qiang Xue committed
537
	{
Qiang Xue committed
538
		$this->params = $params;
Qiang Xue committed
539 540 541 542
		return $this;
	}

	/**
Qiang Xue committed
543 544 545
	 * Adds additional parameters to be bound to the query.
	 * @param array $params list of query parameter values indexed by parameter placeholders.
	 * For example, `array(':name'=>'Dan', ':age'=>31)`.
Qiang Xue committed
546
	 * @return Query the query object itself
Qiang Xue committed
547
	 * @see params()
Qiang Xue committed
548
	 */
Qiang Xue committed
549
	public function addParams($params)
Qiang Xue committed
550
	{
Qiang Xue committed
551 552 553 554 555 556 557 558 559 560 561 562 563
		if ($params !== array()) {
			if ($this->params === null) {
				$this->params = $params;
			} else {
				foreach ($params as $name => $value) {
					if (is_integer($name)) {
						$this->params[] = $value;
					} else {
						$this->params[$name] = $value;
					}
				}
			}
		}
Qiang Xue committed
564 565
		return $this;
	}
w  
Qiang Xue committed
566
}