【发布时间】:2014-06-04 19:28:31
【问题描述】:
如何在 Laravel 中 GROUP BY 多列?
我试过这段代码:
$routes = DB::table('route')
->groupBy('rte_origin')
->groupBy('rte_destination')
->get();
但这不起作用。
【问题讨论】:
-
它对我有用,你找到问题了吗?
如何在 Laravel 中 GROUP BY 多列?
我试过这段代码:
$routes = DB::table('route')
->groupBy('rte_origin')
->groupBy('rte_destination')
->get();
但这不起作用。
【问题讨论】:
将select 放在groupBy 之前,并将参数放在括号中。
$routes = DB::table('route')
->select(['column_1', 'column_2'])
->groupBy(['column_1', 'column_2'])
->get();
【讨论】:
->groupBy()
编辑应用程序的数据库配置文件config/database.php
在 mysql 数组中,设置 strict => false 以禁用 MySQL 的严格模式以使其工作。
【讨论】:
你试过了吗:
$routes = DB::table('route')
->groupBy('rte_origin', 'rte_destination')
->get();
目前无法在此处进行测试,但 API 显示 groupBy() 接受一个数组。
如需参考,请访问:
【讨论】:
认为 Database\Query\Builder::groupBy() 方法接受数组作为参数是错误的。目前,它只接受 N 个字符串参数。
截至撰写本文时,Laravel 框架的当前版本为:v4.2.4,Database\Query\Builder::groupBy() 方法的代码如下:
/**
* Add a "group by" clause to the query.
*
* @param dynamic $columns
* @return \Illuminate\Database\Query\Builder|static
*/
public function groupBy()
{
$this->groups = array_merge((array) $this->groups, func_get_args());
return $this;
}
如果您考虑一下,func_get_args() 返回一个包含所有可能已作为字符串输入的列的数组。因此,该函数的预期输入为:
$builder->groupBy('column1', 'column2', ...);
生成器对象上的 $this->groups 属性应该是一个字符串数组,如下所示:
['column1','column2']
但是,如果我们将一个数组输入到上面的方法中,像这样:
$builder->groupBy(['column1','column2']);
$this->groups 属性最终会得到一个嵌套数组,如下所示:
[['column1','column2']]
查询构建器框架的其余部分期望 $builder->groups 属性是一个非嵌套的字符串数组。因此,当框架尝试以适当的转义格式对表名进行列化和包装时(每个数据库引擎都有不同的表名转义运算符),它会尝试包装一个数组而不是字符串,然后您就会得到错误。
有问题的错误行是 Database\Grammar::wrap() 中的第 49 行。
如果我们要修改 Database\Query\Builder::groupBy() 方法以使其接受数组,我们会像下面这样重写它:
public function groupBy()
{
$args = func_get_args();
foreach($args AS $arg)
{
$arg = (is_array($arg)) ? $arg:[$arg];
$this->groups = array_merge((array) $this->groups, $arg);
}
return $this;
}
此方法在任何参数索引处接受一个数组。
【讨论】: