Laravel の Query Builder を使ってサブクエリーをJOINする

ダイレクトにSQLを書くわけではないQuery Builder。

サブクエリや結合で複雑化すると、個人的にはどんどんややこしくなっていく(笑)

そんな中、いつもサブクエリの結合時にセコセコQuery Builderで作ったものをわざわざToSQLでSQLに変換しDB::rawを使って読み込みなおすといった手法を取っていました。

なんだかなぁと思いながら、もやもやしていたのですが、joinSubなるメソッドを発見。

これを使えば、ToSQLへの変換が不要でスッキリと記述することができるじゃないですかぁ。

Laravelの5.6で追加されていたメソッドらしいのですが、いままで気が付かなかった(笑)たまにはドキュメントを読むことも重要ですね^^

なので何時でも思い出せるよう、メモにまとめておきます。

従来行っていた書き方

$sub_query = HogeHoge::select( 'id', DB::raw('MAX(created_at) As created_at'))->groupBy('fugafuga_id');
$list = FugaFuga::leftJoin(DB::raw("({$sub_query->toSql()}) AS hogehoge"),'fugafuga.id', '=', 'hogehoge.fugafuga_id')->get();

joinSubを使った書き方

$sub_query = HogeHoge::select( 'id', DB::raw('MAX(created_at) As created_at'))->groupBy('fugafuga_id');
$list = FugaFuga::joinSub($sub_query, 'hogehoge', 'fugafuga.id', 'hogehoge.fugafuga_id')->get();

leftJoinSub、rightJoinSubも使えるので、どんなパターンにも使えそうですね♪

use DB しない場合は、\DB::raw。バックスラッシュつけましょうね。