web-dev-qa-db-ja.com

Laravelの複数の列でグループ化

の仕方 GROUP BY Laravelの複数列?私はこのコードを試しました:

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

しかし、これは機能していません。

19
satjan

試しましたか:

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

現在ここでテストすることはできませんが、APIはgroupBy()が配列を受け入れると言います。

参考のため、以下をご覧ください。

36
Gustavo Ramos

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;
}

このメソッドは、任意のパラメーターインデックスで配列を受け入れます。

10
Jon Watson