在Laravel中按多列分组

sat*_*jan 20 database laravel

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

$routes = DB::table('route')
    ->groupBy('rte_origin')
    ->groupBy('rte_destination')
    ->get();
Run Code Online (Sandbox Code Playgroud)

但这不起作用.

Gus*_*mos 38

你试过了吗:

$routes = DB::table('route')
->groupBy('rte_origin', 'rte_destination')
->get();
Run Code Online (Sandbox Code Playgroud)

现在不能在这里测试,但API说groupBy()接受一个数组.

如需参考,请访问:


Jon*_*son 10

认为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;
}
Run Code Online (Sandbox Code Playgroud)

如果你考虑一下,func_get_args()会返回一个可能已经作为字符串输入的所有列的数组.因此,此功能的预期输入是:

$builder->groupBy('column1', 'column2', ...);
Run Code Online (Sandbox Code Playgroud)

生成器对象上生成的$ this-> groups属性应该是一个字符串数组,如下所示:

['column1','column2']
Run Code Online (Sandbox Code Playgroud)

但是,如果我们将数组输入上面的方法,就像这样:

$builder->groupBy(['column1','column2']);
Run Code Online (Sandbox Code Playgroud)

$ this-> groups属性最终会得到一个嵌套数组,如下所示:

[['column1','column2']]
Run Code Online (Sandbox Code Playgroud)

查询构建器框架的其余部分要求$ 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;
}
Run Code Online (Sandbox Code Playgroud)

此方法接受任何参数索引处的数组.


小智 5

将 theselect之前的groupBy和参数放在括号中。

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