web-dev-qa-db-ja.com

Laravel Eloquent Union query

だから私は次のクエリを持っています:

$a = Model::where('code', '=', $code)
    ->where('col_a', '=' , 1)
    ->orderBy(DB::raw('FIELD(layout, "normal", "split", "flip", "double-faced", "") ASC, layout'))

$b = Model::where('code', '=', $code)
    ->where('col_b', '=' , 1)
    ->orderBy(DB::raw('FIELD(layout, "normal", "split", "flip", "double-faced", "") ASC, layout'))

$a->union($b)->get();

最初に 'orderBy()'を実行し、次にunionを実行しても、並べ替えは行われません。

「$ a」または「$ b」を個別に照会すると、「orderBy()」は正常に機能します。

次の方法でそれを行うと、「orderBy()」が全体として発生します。

$a->union($b)
    ->orderBy(DB::raw('FIELD(layout, "normal", "split", "flip", "double-faced", "") ASC, layout'))
    ->get();

「orderBy()」がそれぞれ個別に適用され、結果を結合するようにするにはどうすればよいですか?うまくいくようです。

編集:だれでもこれを行う方法を提供できる場合、たとえそれが通常のMySQLであっても、Eloquentにバグがあるかもしれないと思うので、答えとしてあなたのものを選択します。

5
rotaercz

"merge"Laravelコレクションが役立つ場合があります。
大きな違いは、事前に-> get()を使用してクエリを終了し、union()ではなくmerge()を使用することです。

$a = Model::where('code', '=', $code)
->where('col_a', '=' , 1)
->orderBy(DB::raw('FIELD(layout, "normal", "split", "flip", "double-faced", "") ASC, layout'))->get();

$b = Model::where('code', '=', $code)
->where('col_b', '=' , 1)
->orderBy(DB::raw('FIELD(layout, "normal", "split", "flip", "double-faced", "") ASC, layout'))->get();

$result = $a->merge($b);

注:私はあなたのデータを持っていないので、それが動作することを証明することはできませんが、それは私のデータで少なくとも動作しますので、あなたの試してみる価値があります

6
Ng Sek Long

orderBy()の後にunion()を適用してみてください

これを試して

$a->union($b)->orderBy(DB::raw('FIELD(layout, "normal", "split", "flip", "double-faced", "") ASC, layout'))->get();

[〜#〜] edit [〜#〜]

これを試してみて、雄弁なクエリについて調査し、見つけて準備しました

$modelA = Model::where('code', '=', $code)
    ->where('col_a', '=' , 1)
    ->orderBy(DB::raw('FIELD(layout, "normal", "split", "flip", "double-faced", "") ASC, layout'))

$modelB = Model::where('code', '=', $code)
    ->where('col_b', '=' , 1)
    ->orderBy(DB::raw('FIELD(layout, "normal", "split", "flip", "double-faced", "") ASC, layout'))

$a = DB::table(DB::raw("({$modelA->toSql()}) as a"))
    ->mergeBindings($modelA->getQuery())
    ->selectRaw("a.*");

$b = DB::table(DB::raw("({$modelB->toSql()}) as b"))
    ->mergeBindings($modelB->getQuery())
    ->selectRaw("b.*");

$a->union($b)->get();
4
Jaymin Panchal

以下を試してください:

$a = Model::where('code', '=', $code)
->where('col_a', '=' , 1);

$b = Model::where('code', '=', $code)->where('col_b', '=' , 1)
->union($a)
->get();

$result = $b;
2
Max Roa