Laravel: 选择加入 WHERE 条件的项目 table

Laravel: Selecting Items with WHERE condition is in joined table

我有两个 table(电影和评论)。一部电影有很多评论,而一篇评论属于一部电影

关系: Film.php

public function reviews()
{
    return $this->hasMany('App\Review');
}

和Review.php

public function film()
{
    return $this->belongsTo('App\Film');
}

由于我使用的是 Laravel Eloquent 关系,因此我想使用 Eloquent 构建一个按评论排序的电影列表。评论从 0 = 未评级到 5 = 最高评级。

我需要简单的英语:

我使用 Query Builder 的解决方案出现错误:

$best_films = DB::table('films')
             ->join('reviews', 'reviews.film_id', '=', 'films.id')
             ->select('films.id', 'avg(reviews.rating)')
             ->groupBy('films.id')
             ->orderByRaw('avg(reviews.rating) DESC')
             ->get();

有了这个我得到以下错误: 未找到列:1054 未知列'avg(reviews.rating)' ...

使用 Eloquent ORM 我无法在其他 table 中按列排序。这样的东西不起作用:

 $films = Film::whereHas('reviews')->orderBy('reviews.film_id', 'desc')->get();

我收到错误: 未找到列:1054 'order clause' 中的未知列 'reviews.film_id'...

我的问题: 知道如何解决这个问题吗? (我更喜欢使用 Eloquent Orm)

你应该试试这个

best_films = DB::table('films')
             ->join('reviews', 'reviews.film_id', '=', 'films.id')
             ->select('films.id', DB::raw('avg(reviews.rating)'))
             ->groupBy('films.id')
             ->orderByRaw('avg(reviews.rating) DESC')
             ->get();

我认为你必须像这样在你的关系模型中缩短数据

public function reviews() { return $this->hasMany('App\Review')->orderBy('film_id', 'desc'); }