我认为Laravel 4和Laravel 4. 1之间的union
有一些变化,我有2个型号。
$photos = DB::table('photos')->select('id', 'name', 'created_at');
$videos = DB::table('videos')->select('id', 'name', 'created_at');
我想联合这两个查询,并使用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
在拉腊维尔怎么办?
6条答案
按热度按时间vbopmzt11#
我相信这是一个bug,还没有修复。我在尝试对联合查询排序时也遇到了同样的问题。
导致orderby子句被单独添加到$query 1中。
将orderBy分别添加到$query1和$query2,然后执行如下联合操作
这显然是有效的,但是它产生的结果与对union的结果执行orderBy的结果不同。
目前,变通方案似乎是这样做的
这将生成如下查询:
这就成功了。
6za6bjd02#
我不太了解拉拉威尔,但我敢打赌这首歌一定行:
b4lqfgs43#
它似乎在此拉取请求中得到了修复:https://github.com/laravel/framework/pull/3901
kninwzqo4#
如果您在链接中向它们两个添加orderBy方法,它应该可以工作,如下所示:
现在,正如Barmar所说,Laravel只知道照片查询应该被排序,因为您在第三行中这样做,如果您像上面这样做,它可以被删除。
cxfofazt5#
您可以尝试使用
DB::query()
,如下所示:我想截至目前,它会工作。仍在寻找实际的解决方案!
8ftvxx2r6#
你可以使用fromSub来创建一个联合体的子查询,我发现这比使用mergeBindings要干净得多。