Laravel8 leftJoinSubの使い方とどんな時に使うのか?

■前提条件

makers(メーカー)テーブル
・id

notices(メーカー通知)テーブル
・id
・maker_id

単純な内部結合

$makers = Maker::join('notices as n', 'makers.id', '=', 'n.maker_id')
    ->get();

外部結合

$makers = Maker::leftJoin('notices as n', 'makers.id', '=', 'n.maker_id')
    ->get();

結合先のテーブル(notices)に条件がある場合

$makers = Maker::from('makers as m')
    ->leftJoin('notices as n', function($join){
        $join->on('m.id', '=', 'n.maker_id')
            ->where('n.is_read', '=', 1);
    })
    ->get();

leftJoinSubを使うケース

// 結合先のテーブル(notices)に条件
$q = Notice::from('notices as n')
        ->select(
            'maker_id'
        )
    ->where('n.is_read', '=', 1)
    ->where('n.start_date', '<=', date('Y.m.d'));

// 更に結合先テーブル(notices)にor条件
$notices = $q->where(function($q){
    $q->WhereNull('n.end_date')
        ->orWhere('n.end_date', '>=', date('Y.m.d'));
    });

// 結合先テーブル(notices)をサブクエリ
$makers = Maker::from('makers as m')
    ->select(
        'm.id',
        'm.name',
    )
    ->leftJoinSub($notices, 'n', 'm.id', '=', 'n.maker_id')
    ->get();

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です