Laravel Eloquent Union запрос

Итак, у меня есть следующий запрос:

$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.

2

Решение

«Сливать» функция в коллекции 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);

Примечание: у меня нет ваших данных, поэтому я не могу доказать, что они работают, но, по крайней мере, они работают с моими данными, поэтому стоит попробовать

4

Другие решения

Просто попробуйте подать заявку 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();
2

См. MySql Документация

Использование ORDER BY для отдельных операторов SELECT ничего не говорит о порядке появления строк в конечном результате, поскольку UNION по умолчанию создает неупорядоченный набор строк. Следовательно, использование ORDER BY в этом контексте обычно связано с LIMIT, так что он используется для определения подмножества выбранных строк, которые нужно извлечь для SELECT, даже если это не обязательно влияет на порядок этих строк в окончательный результат UNION. Если ORDER BY появляется без LIMIT в SELECT, он оптимизируется, потому что он все равно не будет иметь никакого эффекта.

-1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector