在 Laravel 中按多列分组

Posted

技术标签:

【中文标题】在 Laravel 中按多列分组【英文标题】:Group by multiple columns in Laravel 【发布时间】:2014-06-04 19:28:31 【问题描述】:

如何在 Laravel 中 GROUP BY 多列? 我试过这段代码:

$routes = DB::table('route')
    ->groupBy('rte_origin')
    ->groupBy('rte_destination')
    ->get();

但这不起作用。

【问题讨论】:

它对我有用,你找到问题了吗? 【参考方案1】:

select 放在groupBy 之前,并将参数放在括号中。

$routes = DB::table('route')
    ->select(['column_1', 'column_2'])
    ->groupBy(['column_1', 'column_2'])
    ->get();

【讨论】:

有点错别字,是->groupBy()【参考方案2】:

编辑应用程序的数据库配置文件config/database.php

mysql 数组中,设置 strict => false 以禁用 MySQL 的严格模式以使其工作。

【讨论】:

你是冠军!!谢谢亲爱的,它就像魅力一样:)【参考方案3】:

你试过了吗:

$routes = DB::table('route')
->groupBy('rte_origin', 'rte_destination')
->get();

目前无法在此处进行测试,但 API 显示 groupBy() 接受一个数组。

如需参考,请访问:

Laravel 5.0:https://github.com/laravel/framework/blob/5.0/src/Illuminate/Database/Query/Builder.php#L1037 Laravel 4.2:https://github.com/laravel/framework/blob/4.2/src/Illuminate/Database/Query/Builder.php#L1017

【讨论】:

这也行不通。显示错误如下。 ErrorException strtolower() 期望参数 1 是字符串,给定数组 哎哟。我很抱歉萨詹。让我回家,我给你做一个测试。 仅供参考,最初 groupBy() 不接受数组,如 ***.com/a/24415397/814160 中所述。该功能是在 L4.2(或可能更早的版本)中添加的,请参阅 github.com/laravel/framework/blob/4.2/src/Illuminate/Database/… 以获取参考。 @GustavoRamos 您指向 laravel 文档的链接已失效。 L5.0 见github.com/laravel/framework/blob/5.0/src/Illuminate/Database/…,L4.2 见github.com/laravel/framework/blob/4.2/src/Illuminate/Database/… 感谢您指出这一点,@SeantheBean。我已经编辑了主要答案。干杯!【参考方案4】:

认为 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;

此方法在任何参数索引处接受一个数组。

【讨论】:

已向 Laravel 团队提交了拉取请求以解决此问题。见:github.com/laravel/framework/pull/4843 L4.2 中添加了将数组传递给 groupBy() 的功能。参考github.com/laravel/framework/blob/4.2/src/Illuminate/Database/…。

以上是关于在 Laravel 中按多列分组的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在 Laravel 8 中按 from 和 to user id 分组

Laravel Query Builder 在按 ID 分组的查询中按子查询减去 COUNT

如何在 Laravel 中按日期排序消息

如何在 SQL 中按多列分组并按日期排序?

如何在 MySQL Select 语句中按多列分组

根据给定的因子在 R 中按函数分组获取多列的百分比值