Browse Source

allow expressions in GROUP BY

tags/2.0.7
Carsten Brandt 9 years ago
parent
commit
f0a62cdbd3
  1. 20
      framework/db/QueryBuilder.php
  2. 8
      tests/framework/db/QueryBuilderTest.php

20
framework/db/QueryBuilder.php

@ -751,7 +751,21 @@ class QueryBuilder extends \yii\base\Object
*/
public function buildGroupBy($columns)
{
return empty($columns) ? '' : 'GROUP BY ' . $this->buildColumns($columns);
if (empty($columns)) {
return '';
}
foreach ($columns as $i => $column) {
if ($column instanceof Expression) {
$columns[$i] = $column->expression;
// TODO
// foreach ($direction->params as $n => $v) {
// $params[$n] = $v;
// }
} elseif (strpos($column, '(') === false) {
$columns[$i] = $this->db->quoteColumnName($column);
}
}
return 'GROUP BY ' . implode(', ', $columns);
}
/**
@ -800,6 +814,10 @@ class QueryBuilder extends \yii\base\Object
foreach ($columns as $name => $direction) {
if ($direction instanceof Expression) {
$orders[] = $direction->expression;
// TODO
// foreach ($direction->params as $n => $v) {
// $params[$n] = $v;
// }
} else {
$orders[] = $this->db->quoteColumnName($name) . ($direction === SORT_DESC ? ' DESC' : '');
}

8
tests/framework/db/QueryBuilderTest.php

@ -601,7 +601,7 @@ class QueryBuilderTest extends DatabaseTestCase
->from('operations')
->orderBy('name ASC, date DESC');
list ($sql, $params) = $this->getQueryBuilder()->build($query);
$expected = $this->replaceQuotes('SELECT * FROM [[operations]] ORDER BY `name`, `date` DESC');
$expected = $this->replaceQuotes('SELECT * FROM [[operations]] ORDER BY [[name]], [[date]] DESC');
$this->assertEquals($expected, $sql);
$this->assertEmpty($params);
@ -611,7 +611,7 @@ class QueryBuilderTest extends DatabaseTestCase
->from('operations')
->orderBy(['name' => SORT_ASC, 'date' => SORT_DESC]);
list ($sql, $params) = $this->getQueryBuilder()->build($query);
$expected = $this->replaceQuotes('SELECT * FROM [[operations]] ORDER BY `name`, `date` DESC');
$expected = $this->replaceQuotes('SELECT * FROM [[operations]] ORDER BY [[name]], [[date]] DESC');
$this->assertEquals($expected, $sql);
$this->assertEmpty($params);
@ -645,7 +645,7 @@ class QueryBuilderTest extends DatabaseTestCase
->from('operations')
->groupBy('name, date');
list ($sql, $params) = $this->getQueryBuilder()->build($query);
$expected = $this->replaceQuotes('SELECT * FROM [[operations]] GROUP BY `name`, `date`');
$expected = $this->replaceQuotes('SELECT * FROM [[operations]] GROUP BY [[name]], [[date]]');
$this->assertEquals($expected, $sql);
$this->assertEmpty($params);
@ -655,7 +655,7 @@ class QueryBuilderTest extends DatabaseTestCase
->from('operations')
->groupBy(['name', 'date']);
list ($sql, $params) = $this->getQueryBuilder()->build($query);
$expected = $this->replaceQuotes('SELECT * FROM [[operations]] GROUP BY `name`, `date`');
$expected = $this->replaceQuotes('SELECT * FROM [[operations]] GROUP BY [[name]], [[date]]');
$this->assertEquals($expected, $sql);
$this->assertEmpty($params);

Loading…
Cancel
Save