Сортировка запросов UNION с помощью Laravel 4.1

Я думаю, что что-то изменилось в 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'); 

Я предполагаю, что знаю, что это сработает. Все еще ищет актуальное решение!