[Laravel] EloquentのJOINで複数条件を指定したい

結論

DB::table() ->leftJoin() で第二引数にクロージャーを渡せるので、その中でフィルタ的な処理を書き込む。

詳細

ユーザーが投稿した記事の一覧を取得する際はこんな感じで LEFT JOIN を指定。

ただし、この場合だと LEFT JOIN (テーブル名) ON (条件式…)の条件式部分に1つの条件(通常はキーカラムをマッチさせる)しか指定できない。

$users = DB::table('users')
        ->leftJoin('posts', 'users.id', '=', 'posts.user_id')
        ->get();

「削除フラグが立っている記事は除外したい」なんて時には、クロージャを使って複数条件を設定可能。

下記ソース内の $join には JoinClause オブジェクトが渡ってくる。(JoinClause の詳細)

DB::table('users')
    ->leftJoin('posts', function ($join) {
        $join->on('users.id', '=', 'posts.user_id')
             ->where('posts.del_flg', '=', false);
    })
    ->get();

 

参考情報:下記公式サイトの「上級のJOIN文」部分を参照