Laravel:在连接表中选择具有WHERE条件的项目

时间:2018-09-19 06:29:37

标签: php laravel eloquent laravel-query-builder

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

关系: 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 =最高评分。

我需要用简单的英语

  • 加入两个表
  • 获取所有具有评论的电影
  • 按film_id分组
  • 计算平均值(一部电影可能有很多评论,所以我需要平均值)
  • 整理结果列表
  • 获取列表

我使用查询生成器的解决方案出现错误:

$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)'...

使用口才ORM 我无法按其他表中的列进行排序。这样的事情不起作用:

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

我得到了错误: 找不到列:1054'order子句'中的未知列'reviews.film_id'...

我的问题: 任何想法如何解决该问题? (我宁愿使用雄辩的Orm)

2 个答案:

答案 0 :(得分:1)

您应该尝试这个

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

答案 1 :(得分:0)

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

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

相关问题