Laravel eloquent order by custom 属性

Posted

技术标签:

【中文标题】Laravel eloquent order by custom 属性【英文标题】:Laravel eloquent order by custom attribute 【发布时间】:2022-01-11 09:40:59 【问题描述】:

我有一个total_views 属性添加到我的Product 模型中,就像这样

public function getTotalViewsAttribute()

  return (int)$this->views()->sum('count');


views()Product 上的关系,就像这样

public function views()

        return $this->morphMany(View::class, 'viewable');

我想做的是通过total_views 订购我的Product。或者换句话说,按views() 关系的总和排序。

我已尝试在查询中使用->orderBy('total_views'),但它似乎没有按预期工作。

我们将不胜感激。

【问题讨论】:

***.com/questions/45586280/…:试试这个 所以你需要orderby关系计数对吗?? @ManojKiranAppathurai 是的。 这能回答你的问题吗? Laravel OrderBy relationship count 【参考方案1】:

Eloquent getter 只能工作,当查询被执行时,你当前的代码不能工作。我总是在查询中使用withCount()

$products = Product ::withCount(['views'])->get();

计数将在名为 views_count; 的属性上。

foreach ($products as $product) 
    $product->views_count; // get view count

也可以按列排序,因为它会出现在查询返回的 SQL 中。

Product ::withCount(['views'])->orderBy('views_count', 'desc')->get();

【讨论】:

以上是关于Laravel eloquent order by custom 属性的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Eloquent 显示查询日志

Laravel Eloquent 关系 - 不根据条件获取

Laravel Eloquent multiple whereHas on relationship where column 'order' 高于前一个 whereHas

Laravel Eloquent Multiple Where with count

Laravel Eloquent LEFT JOIN WHERE NULL

Laravel Eloquent group by 与数据透视表和关系