【问题标题】:Laravel 5.3 How to do Multiple JoinsLaravel 5.3 如何进行多重连接
【发布时间】:2017-05-31 18:33:33
【问题描述】:

我是 Laravel 的新手。我正在制作一个应用程序来评估电视节目的季节。我想获取每个季节的信息,包括平均评分和当前用户的个人评分。

目前我只是在使用原始 MySQL 访问它。

$seasons = \DB::select('

SELECT * FROM seasons

LEFT JOIN (SELECT season_id, AVG(rating) as avg_rating FROM ratings_season 
GROUP BY season_id) t2 ON seasons.id = t2.season_id

LEFT JOIN (SELECT season_id, rating FROM ratings_season WHERE user_id = 1) t3 ON seasons.id = t3.season_id

ORDER BY seasons.number DESC');

如何使用 Laravel 关系将这个原始查询转换为一个?

【问题讨论】:

标签: mysql database laravel


【解决方案1】:

尝试根据自己的喜好调整此代码

DB::table('seasons')
->select('*')
->leftJoin(
    DB::raw('(SELECT season_id, AVG(rating) as avg_rating FROM ratings_season GROUP BY (season_id)
    ) as t2'), function ($join) {
        $join->on ( 'seasons.id', '=', 't2.season_id' );
    }
)
->leftJoin(
    DB::raw('(SELECT season_id, rating FROM ratings_season WHERE user_id = 1) as t3'), function ($join) {
        $join->on ( 'seasons.id', '=', 't3.season_id' );
    }
)
->orderBy('seasons.number', 'desc')
->get();

【讨论】:

    【解决方案2】:

    我建议你看看Laravel Relationships。这是一种连接多个表的超级干净和简单的方法,而不必担心实际的 SQL 查询和它们带来的缺点。 (例如 SQL 注入)

    【讨论】:

      【解决方案3】:

      除了 Laravel Relationships 如 Matthias 建议的那样,您也可以使用 Query Builder 来执行此操作

      $select = DB::table('seasons as s')
      ->leftJoin('ratings_season as t2', function($join) {
          $join->on('t2.season_id', '=', 's.id')
      })
      ->leftJoin('ratings_season as t3', function($join) {
          $join->on('t3.season_id', '=', 's.id')
               ->where('t3.user_id', '=', 1)
      })
      ->orderBy('s.number', 'DESC')
      ->get();
      

      【讨论】:

      • 这是不正确的,OP想加入派生表
      • 你是对的。我错过了这部分。艾迪的回答应该有效。我的道歉
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-18
      • 1970-01-01
      • 2017-05-10
      • 2023-03-07
      • 2017-01-20
      • 2017-01-19
      相关资源
      最近更新 更多