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