【问题标题】:Laravel scope with union带有联合的 Laravel 范围
【发布时间】:2017-11-30 07:10:02
【问题描述】:

我需要一种方法来按两列对我的模型进行排序(但不是按 x,y 的顺序)。我有一个priority 列可以“提升”结果中的模型,而标准created_atpriority 未设置时应该是排序键。我发现这样做的唯一方法是使用工会。

这样的查询:

(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)

所以我尝试做类似的事情:

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 中完成我想要的吗?否则 - 我应该如何重建这个范围以使其工作?

【问题讨论】:

  • 我建议您为所有型号设置优先级(即使大多数情况下这只是 0),这样您就可以通过priority desc, created_at 订购,例如如果优先级相同,则先创建优先级。

标签: php sql laravel eloquent


【解决方案1】:

问题是您在工会中使用$query

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

$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 相同但可以更改,您可以这样做:

    $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 的输出都是:

(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) 

【讨论】:

    猜你喜欢
    • 2021-11-17
    • 2018-04-24
    • 2017-04-08
    • 2016-11-16
    • 1970-01-01
    • 1970-01-01
    • 2021-02-18
    • 1970-01-01
    • 2021-10-19
    相关资源
    最近更新 更多