web-dev-qa-db-fra.com

Laravel requête Union éloquente

J'ai donc la requête suivante:

$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();

Aucun tri ne se produit lorsque j'ordonne d'abord By () puis l'union.

Lorsque je recherche "$ a" ou "$ b" individuellement, "orderBy ()" fonctionne très bien.

Lorsque je le fais de la manière suivante, "orderBy ()" se produit dans son ensemble.

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

Comment puis-je faire en sorte que le "orderBy ()" s'applique à chacun individuellement, puis unir les résultats? Il semble que cela devrait fonctionner.

EDIT: Si quelqu'un peut fournir un moyen de le faire, même si c'est MySQL normal, je choisirai la vôtre comme réponse car je pense qu'il peut y avoir un bug avec Eloquent.

5
rotaercz

La fonction "fusion" dans la collection Laravel peut être en mesure de vous aider.
La grande différence est que je ferme la requête avec a -> get () à l'avance, et j'utilise merge () au lieu de union ()

$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);

Remarque: Je n'ai pas vos données, je ne peux donc pas prouver que cela fonctionne, mais cela fonctionne au moins sur mes données, cela vaut donc la peine d'essayer

6
Ng Sek Long

Essayez simplement d'appliquer orderBy() après union()

Essaye ça

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

MODIFIER

Recherche et recherche éloquente trouvée et préparée

$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

Essayez ce qui suit:

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

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

$result = $b;
3
Max Roa