Laravel mysql内连接并从另一个表中选择一个特定字段

时间:2017-07-31 20:15:56

标签: php mysql laravel eloquent inner-join

我有以下查询:

Ratings::join('users', 'movieratings.rated_by', '=', 'users.usr_id')
        ->where('rated_on', $movieId)
        ->orderBy('rated_at', 'desc')
        ->select('comment', 'rating', 'rated_as', 'rated_at', 'username')
        ->paginate(20);

这将获得特定电影的所有反馈评级。 但是我有另一个表格,其中包含特定电影电影的总好坏评级,唯一的问题是我无法同时查询该表格。

如果我再做一次查询,我只会写:Movie::where('movie_id', $movieId)->select('total_good_ratings', 'total_bad_ratings')->get();这会输出例如" 22,15 "但是是否可以只从特定行获取两列然后在两个表之间进行内部连接并对结果进行分页?

感谢

3 个答案:

答案 0 :(得分:1)

您可以使用包含好评和坏评分的表格进行leftJoin,其中连接条件将是电影的ID。

Ratings::join('users', 'movieratings.rated_by', '=', 'users.usr_id')
        ->leftJoin('movie', 'movie.id', '=', 'movieratings.rated_on')
        ->where('rated_on', $movieId)
        ->orderBy('rated_at', 'desc')
        ->select('comment', 'rating', 'rated_as', 'rated_at', 'username', 'total_good_ratings', 'total_bad_ratings')
        ->paginate(20);

答案 1 :(得分:1)

我想你可以试试这个:

Ratings::leftJoin('users', 'users.usr_id', '=', 'movieratings.rated_by')
        ->leftJoin('movie', 'movie.id', '=', 'movieratings.rated_on')
        ->where('movieratings.rated_on', $movieId)
        ->orderBy('movie.rated_at', 'desc')
        ->select('movieratings.comment', 'movieratings.rating', 'movieratings.rated_as', 'movie.rated_at', 'users.username', 'movieratings.total_good_ratings', 'movieratings.total_bad_ratings')
        ->paginate(20);

希望对你有所帮助!!!

答案 2 :(得分:0)

如果这可能有所帮助:

假设:

class Rating extends Model {
      public users() {
          $this->belongsTo(User::class, 'usr_id');
      }
      public movie() {
          $this->belongsTo(Movie::class, 'rated_on'); //Name looks odd, it should be movie_id if you are following standard conventions
      }
}

然后你可以懒惰/更加加载它们:

$ratings = Ratings::with([ "movie" => function ($query) {
        $q->select('total_good_ratings', 'total_bad_ratings');
     }])->where('rated_on', $movieId)
       ->orderBy('rated_at', 'desc')
       ->select('comment', 'rating', 'rated_as', 'rated_at', 'username',"rated_on")
       ->paginate(20);

您可以通过$ratings[X]->movie->total_good_ratings获取电影信息(循环为$rating->movie->total_good_ratings

虽然有点批评:

  1. total_good_ratings看起来像是派生属性,所以它不应该存储在第一位。它似乎是良好收视率的计数。
  2. 在命名列和表时应使用标准约定,例如外键通常称为<foreign table name in singular>_<foreign field name>示例user_idmovie_id