首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有联合的Laravel示波器

带有联合的Laravel示波器
EN

Stack Overflow用户
提问于 2017-06-27 17:29:01
回答 1查看 811关注 0票数 3

我需要一种按两列对模型进行排序的方法(但不是按x,y排序)。我有一个可以在结果中‘提升’模型的priority列,还有一个标准的created_at,当没有设置priority时,它应该是排序键。我找到的唯一方法就是与工会合作。

使用类似如下的查询:

代码语言:javascript
复制
(SELECT * FROM `charts` WHERE priority IS NOT NULL ORDER BY priority ASC) 
UNION (SELECT * FROM `charts` WHERE priority IS NULL AND created_at IS NOT NULL ORDER BY CREATED_AT ASC) 
UNION (SELECT * FROM `charts` WHERE created_at IS NULL)

所以我试着这样做:

代码语言:javascript
复制
public function scopeSortPriority($query)
{
    return $query->whereNotNull('priority')
        ->orderBy('priority')
        ->union($query->whereNull('priority')
            ->whereNotNull('created_at')
            ->orderBy('created_at'))
        ->union($query->whereNull('priority')
            ->whereNull('created_at'));
}

但令人遗憾的是,它并不起作用。

有没有其他方法可以在SQL中实现我想要的功能?否则-我应该如何重新构建这个作用域以使其工作?

EN

回答 1

Stack Overflow用户

发布于 2017-06-27 22:11:06

问题是您在联盟中使用了$query

如果您知道查询和联合的公共部分总是\DB::table('charts'),那么您可以这样做:

代码语言:javascript
复制
$query->whereNotNull('priority')
    ->orderBy('priority')
    ->union(\DB::table('charts')->whereNull('priority')
        ->whereNotNull('created_at')
        ->orderBy('created_at'))
    ->union(\DB::table('charts')->whereNull('priority')
        ->whereNull('created_at'));

如果$query是相同的,但可以更改,您可以这样做:

代码语言:javascript
复制
    $query2 = clone $query;
    $query3 = clone $query;

    $query->whereNotNull('priority')
    ->orderBy('priority')
    ->union($query2->whereNull('priority')
        ->whereNotNull('created_at')
        ->orderBy('created_at'))
    ->union($query3->whereNull('priority')
        ->whereNull('created_at'));

在这两种情况下,sql的输出都是:

代码语言:javascript
复制
(select * from `charts` where `priority` is not null order by `priority` asc) union (select * from `charts` where `priority` is null and `created_at` is not null order by `created_at` asc) union (select * from `charts` where `priority` is null and `created_at` is null) 
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44776744

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档