【发布时间】:2017-11-30 07:10:02
【问题描述】:
我需要一种方法来按两列对我的模型进行排序(但不是按 x,y 的顺序)。我有一个priority 列可以“提升”结果中的模型,而标准created_at 在priority 未设置时应该是排序键。我发现这样做的唯一方法是使用工会。
这样的查询:
(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订购,例如如果优先级相同,则先创建优先级。