Итак, у меня есть следующий запрос:
$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 ()», а затем объединение.
Когда я делаю запрос ‘$ a’ или ‘$ b’ по отдельности, ‘orderBy ()’ работает нормально.
Когда я делаю это следующим образом, «orderBy ()» происходит в целом.
$a->union($b)
->orderBy(DB::raw('FIELD(layout, "normal", "split", "flip", "double-faced", "") ASC, layout'))
->get();
Как я могу сделать так, чтобы «orderBy ()» применялся для каждого индивидуально, а затем объединять результаты обратно? Кажется, это должно работать.
РЕДАКТИРОВАТЬ: Если кто-нибудь может предоставить способ сделать это, даже если это обычный MySQL, я выберу ваш в качестве ответа, так как я думаю, что может быть ошибка с Eloquent.
«Сливать» функция в коллекции Laravel может помочь вам.
Большая разница в том, что я заранее закрываю запрос с помощью -> get () и использую merge () вместо 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);
Примечание: у меня нет ваших данных, поэтому я не могу доказать, что они работают, но, по крайней мере, они работают с моими данными, поэтому стоит попробовать
Просто попробуйте подать заявку orderBy()
после union()
Попробуй это
$a->union($b)->orderBy(DB::raw('FIELD(layout, "normal", "split", "flip", "double-faced", "") ASC, layout'))->get();
РЕДАКТИРОВАТЬ
Изучил и нашел и подготовил красноречивый запрос просто попробуйте это
$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();
См. MySql Документация
Использование ORDER BY для отдельных операторов SELECT ничего не говорит о порядке появления строк в конечном результате, поскольку UNION по умолчанию создает неупорядоченный набор строк. Следовательно, использование ORDER BY в этом контексте обычно связано с LIMIT, так что он используется для определения подмножества выбранных строк, которые нужно извлечь для SELECT, даже если это не обязательно влияет на порядок этих строк в окончательный результат UNION. Если ORDER BY появляется без LIMIT в SELECT, он оптимизируется, потому что он все равно не будет иметь никакого эффекта.