Laravel Query Builder:按附加字段排序

时间:2018-03-21 14:42:49

标签: php laravel laravel-query-builder

我的模型看起来像:

protected $appends = array('status');
public function getStatusAttribute()
{
    if ($this->someattribute == 1) {
        $status = 'Active';
    } elseif ($this->someattribute == 2) {
        $status = 'Canceled';
    ...
    } else {
        $status = 'Some antoher status';
    }
    return $status;  
}

我想通过此status属性订购此模型的集合,是否可能?

Model::where(...)->orderBy(???)

P.S。我需要完全orderBy,而不是sortBy解决方案。

2 个答案:

答案 0 :(得分:0)

你可以使用

Model::where(...)->orderBy('someattribute')->get();

在这种情况下,您只能使用整数值代替someattribute,或者您可以使用DB查询

DB::select(DB::raw('(CASE WHEN someattribute = 1 THEN "Active" CASE WHEN someattribute = 1 THEN "Canceled" ELSE "Some antoher status" END) AS status'))
->orderBy('someattribute', 'desc');

答案 1 :(得分:0)

没有办法使Eloquent这样做,因为它仅创建一个SQL查询。它无法将代码中的PHP逻辑转换为SQL查询。

一种解决方法是在以后遍历结果并手动检查附加字段。在这里收藏可能会有用。