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 = 最高评级。
我需要简单的英语:
- 加入两个tables
- 获取所有有评论的电影
- 分组 film_id
- 计算平均值(一部电影可能有很多评论,所以我需要平均值)
- 组织结果列表
- 获取列表
我使用 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');
}
我有两个 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 = 最高评级。
我需要简单的英语:
- 加入两个tables
- 获取所有有评论的电影
- 分组 film_id
- 计算平均值(一部电影可能有很多评论,所以我需要平均值)
- 组织结果列表
- 获取列表
我使用 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');
}