laravelのクエリビルダに関してのメモです。
やりたいこと
サブクエリをJOINしたい。
joinSub()
今回はサブクエリで追加するカラムにデータがない場合も取得をしたいためleftjoin()で外部結合します。
leftjoinSub()の引数には、サブクエリ、テーブルのエイリアス、クロージャを定義します。
クロージャ内には結びつけるカラムの条件式を定義します。
//サブクエリ
$rating_avgs = Review::selectRaw('movie_id, AVG(rating) as rating_avg')->groupBy('movie_id');
$movie = Movie::leftjoinSub($rating_avgs, 'rating_avg', function($join){
$join->on('movies.id', '=', 'rating_avg.movie_id');})
->get();
サブクエリのrating_avg
が同時に取得できています。
=> Illuminate\Database\Eloquent\Collection {#3155
all: [
App\Models\Movie {#3140
id: 1,
user_id: 1,
title: "Title1",
director: "Director1",
actor: "Actor1",
text: "これはテスト投稿1です。",
deleted_at: null,
created_at: "2020-03-01 05:04:58",
updated_at: "2020-03-01 05:04:58",
movie_id: 1,
rating_avg: "3.0000",
},
App\Models\Movie {#3125
id: 2,
user_id: 2,
title: "Title2",
director: "Director2",
actor: "Actor2",
text: "これはテスト投稿2です。",
deleted_at: null,
created_at: "2020-03-01 05:04:58",
updated_at: "2020-03-01 05:04:58",
movie_id: 2,
rating_avg: "4.0000",
},
],
}