使用Laravel 4.1对UNION查询进行排序

Jac*_*int 6 php laravel eloquent laravel-4

我认为unionLaravel 4和Laravel 4.1之间有一些变化.我有2个型号.

$photos = DB::table('photos')->select('id', 'name', 'created_at');
$videos = DB::table('videos')->select('id', 'name', 'created_at');
Run Code Online (Sandbox Code Playgroud)

我想结合2个查询并命令2个查询created_at字段.

$photos = $photos->orderBy('created_at', 'desc');
$combined = $photos->union($videos);
Run Code Online (Sandbox Code Playgroud)

使用Laravel 4,它给了我这个查询:

select `id`, `name`, `created_at` from `videos`
union
select `id`, `name`, `created_at` from `photos`
order by `created_at` desc
Run Code Online (Sandbox Code Playgroud)

这样就行了,它将两个查询的结果排序在一起.在Laravel 4.1中它给了我这个查询:

(select `id`, `name`, `created_at` from `videos`)
union
(select `id`, `name`, `created_at` from `photos` order by `created_at` desc)
Run Code Online (Sandbox Code Playgroud)

这会产生一个视频列表,然后是一个有序的照片列表.我需要有一个列表,其中组合的查询被排序.我希望Laravel给我这个问题:

(select `id`, `name`, `created_at` from `videos`)
union
(select `id`, `name`, `created_at` from `photos`)
order by `created_at` desc
Run Code Online (Sandbox Code Playgroud)

怎么在Laravel工作?

小智 8

我认为这是一个错误,尚未修复.尝试排序联合查询时遇到同样的问题.

$query1->union($query2)->orderBy('foo','desc') 
Run Code Online (Sandbox Code Playgroud)

导致order by子句单独添加到$ query 1.

将orderBy单独添加到$ query1和$ query2,然后执行如下所示的联合

$query1->orderBy('foo desc');
$query2->orderBy('foo desc');
$query1->union($query2);
Run Code Online (Sandbox Code Playgroud)

这显然有效,但它不会产生与在union的结果上执行orderBy相同的结果.

目前,解决方法似乎正在做类似的事情

$query = $query1->union($query2);
$querySql = $query->toSql();
$query = DB::table(DB::raw("($querySql order by foo desc) as a"))->mergeBindings($query);
Run Code Online (Sandbox Code Playgroud)

这会产生如下查询:

select * from (
  (select a as foo from foo)
  union
  (select b as foo from bar)
) as a order by foo desc;
Run Code Online (Sandbox Code Playgroud)

这就是诀窍.


Bar*_*mar 5

我不太了解 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');
Run Code Online (Sandbox Code Playgroud)


Jac*_*int 4

它似乎已在此拉取请求中修复:https://github.com/laravel/framework/pull/3901