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

oalqel3c  于 2023-02-03  发布在  PHP
关注(0)|答案(6)|浏览(106)

我认为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

在拉腊维尔怎么办?

vbopmzt1

vbopmzt11#

我相信这是一个bug,还没有修复。我在尝试对联合查询排序时也遇到了同样的问题。

$query1->union($query2)->orderBy('foo','desc')

导致orderby子句被单独添加到$query 1中。
将orderBy分别添加到$query1和$query2,然后执行如下联合操作

$query1->orderBy('foo desc');
$query2->orderBy('foo desc');
$query1->union($query2);

这显然是有效的,但是它产生的结果与对union的结果执行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;

这就成功了。

6za6bjd0

6za6bjd02#

我不太了解拉拉威尔,但我敢打赌这首歌一定行:

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

kninwzqo4#

如果您在链接中向它们两个添加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);

现在,正如Barmar所说,Laravel只知道照片查询应该被排序,因为您在第三行中这样做,如果您像上面这样做,它可以被删除。

cxfofazt

cxfofazt5#

您可以尝试使用DB::query(),如下所示:

DB::query('(Select id,name,created_at from photos) 
           union 
           (Select id,name,created_at from videos) order by created_at ASC');

我想截至目前,它会工作。仍在寻找实际的解决方案!

8ftvxx2r

8ftvxx2r6#

你可以使用fromSub来创建一个联合体的子查询,我发现这比使用mergeBindings要干净得多。

$photos = DB::table('photos')->select('id', 'name', 'created_at');
$videos = DB::table('videos')->select('id', 'name', 'created_at')->union($photos);

$result = DB::query()->fromSub($querySql, 'a')->orderBy('year', 'desc')->get();

相关问题