Laravel 5.3如何进行多个连接

时间:2017-01-16 20:33:22

标签: mysql database laravel

我是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 Relationships将此原始查询转换为一个?

3 个答案:

答案 0 :(得分: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();

答案 1 :(得分:0)

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

答案 2 :(得分:-1)

Matthias建议的Laravel Relationships除外,您也可以使用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();