【问题标题】:Laravel Query Builder: order by appends fieldLaravel 查询生成器:按附加字段排序
【发布时间】:2018-08-30 17:59:05
【问题描述】:

我的模型看起来像:

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

附言我需要的是 orderBy,而不是 sortBy 解决方案。

【问题讨论】:

  • 你可以->orderBy("someattribute")吗?如果没有,则有->orderByRaw(),您可以在其中使用CASE IF ... 等扩展排序。除此之外,当您拥有status 属性时,它不再是查询构建器实例,而是Collection,这将使用sortBy(你说的不好)
  • no.. append 属性在查询后生成.. 你需要在查询后进行集合排序
  • 为什么它必须是orderBy() 解决方案?

标签: php laravel laravel-query-builder


【解决方案1】:

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

一种解决方法是在之后循环遍历结果并手动检查附加字段。集合在这里可能有用。

【讨论】:

    【解决方案2】:

    你可以使用

    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');
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多