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

Php Laravel mysql内部连接,并从另一个表中选择特定字段,php,mysql,laravel,eloquent,inner-join,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') ->p

我有以下疑问:

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”,但是否可以只从特定行获取两列,然后在两个表之间进行内部联接并对结果进行分页


谢谢

您可以对包含好和坏评级的表进行leftJoin,其中join条件将是电影的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);

您可以对包含好和坏评级的表执行leftJoin,其中join条件将是电影的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);

我想你可以试试这个:

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

希望这对你有帮助

我想你可以试试这个:

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

希望这对你有帮助

如果这可能有帮助:

假设:

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
      }
}
然后,您可以懒洋洋地/eaher加载它们:

$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\u good\u ratings
(在
$ratings->movie->total\u good\u ratings

不过有点批评:

  • total\u good\u ratings
    看起来像是一个派生属性,因此它不应该首先存储。它似乎是一个良好评级的计数
  • 命名列和表时应使用标准约定,例如外键通常称为
    示例
    用户id
    电影id

  • 如果这可能有帮助:

    假设:

    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
          }
    }
    
    然后,您可以懒洋洋地/eaher加载它们:

    $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\u good\u ratings
    (在
    $ratings->movie->total\u good\u ratings

    不过有点批评:

  • total\u good\u ratings
    看起来像是一个派生属性,因此它不应该首先存储。它似乎是一个良好评级的计数
  • 命名列和表时应使用标准约定,例如外键通常称为
    示例
    用户id
    电影id

  • 为什么不使用普通的雄辩关系而不是联接?这样容易得多。@apokryfos主要是因为我不确定调用一些laravels帮助函数时会发生什么。我发现编写原始sql更容易,只要它们在大多数时候是安全的为什么不使用普通的雄辩关系而不是联接f连接?这样容易得多。@apokryfos主要是因为我不确定调用某些laravels helper函数时会发生什么。我发现编写原始sql更容易,只要它们在大多数时间都是安全的。这意味着在没有电影评级的情况下可能会有评级。如何在选择字段中放置别名?这意味着在没有对电影进行分级的情况下可能会进行分级。如何在“选择”字段中放置别名?