Я думаю, что что-то изменилось в union
между Laravel 4 и Laravel 4.1. У меня 2 модели.
$photos = DB::table('photos')->select('id', 'name', 'created_at'); $videos = DB::table('videos')->select('id', 'name', 'created_at');
Я хочу объединить 2 запроса и заказать 2 запроса с помощью поля created_at
.
$photos = $photos->orderBy('created_at', 'desc'); $combined = $photos->union($videos);
С Laravel 4 он дает мне этот запрос:
select `id`, `name`, `created_at` from `videos` union select `id`, `name`, `created_at` from `photos` order by `created_at` desc
Это работает нормально, он сортирует результаты для обоих запросов вместе. В Laravel 4.1 он дает мне этот запрос:
(select `id`, `name`, `created_at` from `videos`) union (select `id`, `name`, `created_at` from `photos` order by `created_at` desc)
Это приводит к списку видеороликов, а затем упорядоченному списку фотографий. Мне нужно иметь список, в котором сортируются объединенные запросы. Я хочу, чтобы Laravel дал мне этот запрос:
(select `id`, `name`, `created_at` from `videos`) union (select `id`, `name`, `created_at` from `photos`) order by `created_at` desc
Как получить эту работу в Laravel?
Это я считаю ошибкой и пока не исправлено. У меня такая же проблема при попытке сортировать запросы объединения.
$query1->union($query2)->orderBy('foo','desc')
приводит к тому, что предложение order by добавляется только в $ query 1.
Добавление orderBy индивидуально к $ query1 и $ query2, а затем делает объединение, как показано ниже
$query1->orderBy('foo desc'); $query2->orderBy('foo desc'); $query1->union($query2);
Это, очевидно, работает, но это не дает того же результата, что и выполнение orderBy в результате объединения.
На данный момент обходной путь, похоже, делает что-то вроде
$query = $query1->union($query2); $querySql = $query->toSql(); $query = DB::table(DB::raw("($querySql order by foo desc) as a"))->mergeBindings($query);
Это вызовет такой запрос, как:
select * from ( (select a as foo from foo) union (select b as foo from bar) ) as a order by foo desc;
И это делает трюк.
Кажется, что исправлено в этом запросе на растяжение : https://github.com/laravel/framework/pull/3901
Я не знаю Laravel, но я готов поспорить, что это сделает это:
$photos = DB::table('photos')->select('id', 'name', 'created_at'); $videos = DB::table('videos')->select('id', 'name', 'created_at'); $combined = $photos->union($videos)->orderBy('created_at', 'desc');
Он должен работать, если вы добавляете методы orderBy в цепочку для обоих из них, например:
$photos = DB::table('photos')->select('id', 'name', 'created_at')->orderBy('created_at', 'desc'); $videos = DB::table('videos')->select('id', 'name', 'created_at')->orderBy('created_at', 'desc'); $combined = $photos->union($videos);
Прямо сейчас, как сказал Бармар, Ларавель только знает, что запрос фотографий должен быть заказан, поскольку вы делаете это в своей третьей строке, которую можно удалить, если вы сделаете это, как описано выше.
Вы можете попробовать с DB::query()
как показано ниже:
DB::query('(Select id,name,created_at from photos) union (Select id,name,created_at from videos) order by created_at ASC');
Я предполагаю, что знаю, что это сработает. Все еще ищет актуальное решение!