2017-01-20 6 views
0

Поэтому у меня есть следующий запрос:запрос Laravel Eloquent Союз

$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()» применялся для каждого отдельно, а затем объединял результаты назад? Похоже, он должен работать.

EDIT: Если кто-то может предоставить способ сделать это, даже если это обычный MySQL, я выберу ваш ответ в качестве ответа, поскольку я думаю, что может быть ошибка с Eloquent.

+0

Почему это «не работает». Какая ошибка или выход – Gayan

+0

Ошибка. Кажется, это не похоже на сортировку orderBy. – rotaercz

+0

Это некрасивая вещь, это дело MySQL. См. «Followup» в принятом ответе здесь: http://stackoverflow.com/questions/24683766/how-to-use-order-by-inside-union. В принципе: ORDER BY будет игнорироваться в UNION и может даже зависеть от версии MySQL. – zmippie

ответ

0

Просто попробуйте применить 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(); 
+0

Я не хочу, чтобы он был заказан в целом. Я хочу, чтобы отдельные запросы заказывались внутри себя. – rotaercz

+0

можете ли вы опубликовать результат без объединения и с объединением, чтобы узнать больше о проблемах? –

+0

Было бы сложно, потому что я упростил запрос на вопрос. В принципе сортировки не происходит, когда я заказываюBy() сначала, а затем объединяется. Когда я делаю их индивидуально, orderBy() работает нормально. Когда я делаю это на основании ответа, вы отправили orderBy() в целом. – rotaercz

0

См MySql Documentation

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

+0

Это не чистый MySQL. Это Ларавель Красноречивый. Он должен работать на основе того, что сказал разработчик Laravel на github. Хотя на данный момент я был бы доволен решением MySQL. – rotaercz

2

«сливаться» функция в коллекции Laravel может быть в состоянии помочь вам.
Большой различно, что я закрыть запрос с -> получить() заранее, и я использую слияние() вместо объединения()

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

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

+1

Я добавил -> get(); до конца ваших примеров $ a и $ b. Решение, которое вы предоставили в виде нескольких работ, но требует попадания в базу данных для каждого из них, чего я пытаюсь избежать, потому что мне требуется несколько объединений, но в настоящее время это лучший ответ. – rotaercz

Смежные вопросы