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

标签 php laravel laravel-4 eloquent

我认为 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');

我想合并 2 个查询并使用 created_at 字段对 2 个查询进行排序。

$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;

这就是诀窍。

关于php - 使用 Laravel 4.1 对 UNION 查询进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21497865/

相关文章:

laravel - 如何在 Laravel 4 中获取 @if 语句(Blade)中的当前 URL?

laravel-4 - 多对多加入 Laravel Eloquent

php - 通过 URL 参数的 SQL 注入(inject)

php - 用于长 if 条件的 PSR-2 标准

Laravel & vue axios get 方法返回 Getters & Setters?

javascript - 从 jquery 动态输入字段获取值

php - laravel 4.2 对复杂查询进行分页

php - 带有超时条件的 XMLHTTPRequest

php - fgets 和 current 有什么区别?

laravel - 如何实现 Laravel Redis 速率限制