EloquentでModelに論理削除(SoftDeletes)を設定しておくと、デフォルトでdeleted_at is null
をWHERE条件に入れてSQLを発行してくれます。
しかし、テーブル結合(JOIN)をした場合、結合したテーブルに対して論理削除の抽出条件が効きません。
$users = User::join('deptments', 'users.deptment_id', '=', 'deptments.id')->get();
select
*
from
`users`
inner join `deptments`
on `users`.`deptment_id` = `deptments`.`id`
where
`users`.`deleted_at` is null
それならとwhereを設定してみるも、これだとLEFT JOINの場合に結合しなかったusersテーブルのレコードが抽出されなくなってしまいます。
$users = User::join('deptments', 'users.deptment_id', '=', 'deptments.id')
->where('deptments.deleted_at', null)->get();
select
*
from
`users`
inner join `deptments`
on `users`.`deptment_id` = `deptments`.`id`
where
`deptments`.`deleted_at` is null
and `users`.`deleted_at` is null
第二引数にクロージャを渡すとJOIN句の中で複数の抽出条件を使えるようになります。
$users = User::join('deptments', function ($join) {
$join->on('users.deptment_id', '=', 'deptments.id')
->where('deptments.deleted_at', null);
})->get();
select
*
from
`users`
inner join `deptments`
on `users`.`deptment_id` = `deptments`.`id`
and `deptments`.`deleted_at` is null
where
`users`.`deleted_at` is null
意図したSQLを発行することができました。