如何在Laravel中GROUP BY多列?我试了这个代码:
GROUP BY
$routes = DB::table('route') ->groupBy('rte_origin') ->groupBy('rte_destination') ->get();
但这是行不通的。
rlcwz9us1#
你有没有试过:
$routes = DB::table('route') ->groupBy('rte_origin', 'rte_destination') ->get();
现在不能在这里测试,但是API说groupBy()接受数组。如需参考,请访问:
slhcrj9b2#
认为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', ...);
生成的builder对象上的$this->groups属性应该是一个字符串数组,如下所示:
['column1','column2']
但是,如果我们将一个数组输入到上面的方法中,像这样:
$builder->groupBy(['column1','column2']);
$this->groups属性最终会得到一个嵌套数组,如下所示:
[['column1','column2']]
查询构建器框架的其余部分期望$builder->groups属性是一个非嵌套的字符串数组。因此,当框架试图以适当的转义格式列化和 Package 表名时(每个数据库引擎都有不同的表名转义运算符),它试图 Package 数组而不是字符串,您会得到错误。引起问题的错误行是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; }
此方法接受任何参数索引处的数组。
xhv8bpkk3#
将select放在groupBy之前,参数放在括号中。
select
groupBy
$routes = DB::table('route') ->select(['column_1', 'column_2']) ->groupBy(['column_1', 'column_2']) ->get();
kx7yvsdv4#
编辑应用程序的数据库配置文件config/database.php在mysql数组中,设置strict => false以禁用MySQL的严格模式来使其工作。
config/database.php
strict => false
y0u0uwnf5#
只能为1个查询运行此操作
config()->set('database.connections.mysql.strict', false); DB::reconnect(); Model::query(); config()->set('database.connections.mysql.strict', true); DB::reconnect();
5条答案
按热度按时间rlcwz9us1#
你有没有试过:
现在不能在这里测试,但是API说groupBy()接受数组。
如需参考,请访问:
slhcrj9b2#
认为Database\Query\Builder::groupBy()方法接受数组作为参数是不正确的。目前,它只接受N个字符串参数。
在撰写本文时,Laravel框架的当前版本是:v4.2.4,Database\Query\Builder::groupBy()方法的代码如下:
仔细想想,func_get_args()返回一个数组,其中包含可能作为字符串输入的所有列。因此,该函数的预期输入为:
生成的builder对象上的$this->groups属性应该是一个字符串数组,如下所示:
但是,如果我们将一个数组输入到上面的方法中,像这样:
$this->groups属性最终会得到一个嵌套数组,如下所示:
查询构建器框架的其余部分期望$builder->groups属性是一个非嵌套的字符串数组。因此,当框架试图以适当的转义格式列化和 Package 表名时(每个数据库引擎都有不同的表名转义运算符),它试图 Package 数组而不是字符串,您会得到错误。
引起问题的错误行是Database\Grammar::wrap()中的第49行。
如果我们要修改Database\Query\Builder::groupBy()方法以使其接受数组,我们将重写如下:
此方法接受任何参数索引处的数组。
xhv8bpkk3#
将
select
放在groupBy
之前,参数放在括号中。kx7yvsdv4#
编辑应用程序的数据库配置文件
config/database.php
在mysql数组中,设置
strict => false
以禁用MySQL的严格模式来使其工作。y0u0uwnf5#
只能为1个查询运行此操作