【问题标题】:Laravel: Selecting Items with WHERE condition is in joined tableLaravel:选择具有 WHERE 条件的项目在连接表中
【发布时间】:2018-09-19 06:29:36
【问题描述】:

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

关系: 电影.php

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

和 Review.php

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

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

我需要简单的英语:

  • 加入两个表
  • 获取所有有评论的电影
  • 按电影 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 我不能按其他表中的列排序。这样的事情不起作用:

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

我得到错误: 未找到列:1054 未知列 'reviews.film_id' in 'order Clause'...

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

【问题讨论】:

  • 我认为你需要在 Eloquent 上使用 ->with('reviews') Film::whereHas('reviews')->with('reviews')->orderBy('reviews.film_id', 'desc')->get();
  • 使用“->with('reviews')”得到同样的错误:找不到列:1054 未知列'reviews.film_id'。因为 WHERE 列在 Joined 表中

标签: php laravel eloquent laravel-query-builder


【解决方案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();

【讨论】:

  • Hier 是解决方案!非常感谢!
【解决方案2】:

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

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

【讨论】:

  • 这会取回所有电影,而不考虑或评论有与否
猜你喜欢
  • 1970-01-01
  • 2013-12-25
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
  • 2014-08-26
  • 2014-01-01
  • 1970-01-01
相关资源
最近更新 更多