如何在Laravel中GROUP BY
多列?
我试过这段代码:
$routes = DB::table('route')
->groupBy('rte_origin')
->groupBy('rte_destination')
->get();
但这不起作用。
答案 0 :(得分:33)
你有没有尝试过:
$routes = DB::table('route')
->groupBy('rte_origin', 'rte_destination')
->get();
目前无法在此测试,但API表示groupBy()接受数组。
供参考,请访问:
答案 1 :(得分:9)
认为Database \ Query \ Builder :: groupBy()方法接受数组作为参数是不正确的。目前,它只接受N个字符串参数。
在撰写本文时,Laravel Framework的当前版本是: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;
}
此方法接受任何参数索引处的数组。
答案 2 :(得分:0)
编辑应用程序的数据库配置文件config/database.php
在mysql数组中,将strict => false
设置为禁用MySQL的严格模式以使其正常工作。
答案 3 :(得分:0)
将select
放在groupBy
之前,并将参数放在方括号中。
$routes = DB::table('route')
->select(['column_1', 'column_2'])
->groupBy(['column_1', 'column_2'])
->get();