Browse Source

expression support in orderBy and groupBy (#10693)

this is the BC breaking solution for #10682

to be merged for 2.1.x
tags/3.0.0-alpha1
Carsten Brandt 9 years ago
parent
commit
25ac762d8c
  1. 32
      framework/db/QueryBuilder.php
  2. 19
      framework/db/sqlite/QueryBuilder.php

32
framework/db/QueryBuilder.php

@ -96,27 +96,12 @@ class QueryBuilder extends \yii\base\Object
$this->buildFrom($query->from, $params),
$this->buildJoin($query->join, $params),
$this->buildWhere($query->where, $params),
$this->buildGroupBy($query->groupBy),
$this->buildGroupBy($query->groupBy, $params),
$this->buildHaving($query->having, $params),
];
$sql = implode($this->separator, array_filter($clauses));
$sql = $this->buildOrderByAndLimit($sql, $query->orderBy, $query->limit, $query->offset);
if (!empty($query->orderBy)) {
foreach ($query->orderBy as $expression) {
if ($expression instanceof Expression) {
$params = array_merge($params, $expression->params);
}
}
}
if (!empty($query->groupBy)) {
foreach ($query->groupBy as $expression) {
if ($expression instanceof Expression) {
$params = array_merge($params, $expression->params);
}
}
}
$sql = $this->buildOrderByAndLimit($sql, $query->orderBy, $query->limit, $query->offset, $params);
$union = $this->buildUnion($query->union, $params);
if ($union !== '') {
@ -819,9 +804,10 @@ class QueryBuilder extends \yii\base\Object
/**
* @param array $columns
* @param array $params the binding parameters to be populated
* @return string the GROUP BY clause
*/
public function buildGroupBy($columns)
public function buildGroupBy($columns, &$params)
{
if (empty($columns)) {
return '';
@ -829,6 +815,7 @@ class QueryBuilder extends \yii\base\Object
foreach ($columns as $i => $column) {
if ($column instanceof Expression) {
$columns[$i] = $column->expression;
$params = array_merge($params, $column->params);
} elseif (strpos($column, '(') === false) {
$columns[$i] = $this->db->quoteColumnName($column);
}
@ -854,11 +841,12 @@ class QueryBuilder extends \yii\base\Object
* @param array $orderBy the order by columns. See [[Query::orderBy]] for more details on how to specify this parameter.
* @param integer $limit the limit number. See [[Query::limit]] for more details.
* @param integer $offset the offset number. See [[Query::offset]] for more details.
* @param array $params the binding parameters to be populated
* @return string the SQL completed with ORDER BY/LIMIT/OFFSET (if any)
*/
public function buildOrderByAndLimit($sql, $orderBy, $limit, $offset)
public function buildOrderByAndLimit($sql, $orderBy, $limit, $offset, &$params)
{
$orderBy = $this->buildOrderBy($orderBy);
$orderBy = $this->buildOrderBy($orderBy, $params);
if ($orderBy !== '') {
$sql .= $this->separator . $orderBy;
}
@ -871,9 +859,10 @@ class QueryBuilder extends \yii\base\Object
/**
* @param array $columns
* @param array $params the binding parameters to be populated
* @return string the ORDER BY clause built from [[Query::$orderBy]].
*/
public function buildOrderBy($columns)
public function buildOrderBy($columns, &$params)
{
if (empty($columns)) {
return '';
@ -882,6 +871,7 @@ class QueryBuilder extends \yii\base\Object
foreach ($columns as $name => $direction) {
if ($direction instanceof Expression) {
$orders[] = $direction->expression;
$params = array_merge($params, $column->params);
} else {
$orders[] = $this->db->quoteColumnName($name) . ($direction === SORT_DESC ? ' DESC' : '');
}

19
framework/db/sqlite/QueryBuilder.php

@ -410,27 +410,12 @@ class QueryBuilder extends \yii\db\QueryBuilder
$this->buildFrom($query->from, $params),
$this->buildJoin($query->join, $params),
$this->buildWhere($query->where, $params),
$this->buildGroupBy($query->groupBy),
$this->buildGroupBy($query->groupBy, $params),
$this->buildHaving($query->having, $params),
];
$sql = implode($this->separator, array_filter($clauses));
$sql = $this->buildOrderByAndLimit($sql, $query->orderBy, $query->limit, $query->offset);
if (!empty($query->orderBy)) {
foreach ($query->orderBy as $expression) {
if ($expression instanceof Expression) {
$params = array_merge($params, $expression->params);
}
}
}
if (!empty($query->groupBy)) {
foreach ($query->groupBy as $expression) {
if ($expression instanceof Expression) {
$params = array_merge($params, $expression->params);
}
}
}
$sql = $this->buildOrderByAndLimit($sql, $query->orderBy, $query->limit, $query->offset, $params);
$union = $this->buildUnion($query->union, $params);
if ($union !== '') {

Loading…
Cancel
Save