【Laravel】whereIn メソッドで生成されるIN句の中にサブクエリを書く
問題
以下のように複数のIDを指定して一括で更新したい場面がありました。
$divIds = Div::where('hoge_flg', true)->select('id')->get(); User::whereIn('div_id', $ids)->update(['hoge_flg' => true]);
ただ、上記のように書くと2回クエリが発行されるのであまり良くないなと思いました。
- Div モデルの ID を取得する
- User モデルのフラグを更新する
そこで以下のような SQL が生成されるような Eloquent がないか調べてみました。
update user_table set hoge_flg = true where id in ( select id from div_table where hoge_flg = true );
結論
whereIn メソッドの第2引数にクエリオブジェクトを渡せます…!
User::whereIn('div_id', Div::where('hoge_flg', true)->select('id'))->update(['hoge_flg' => true]);
ドキュメントにも思っきり書いてますね…
ドキュメント… やはりドキュメントはすべてを解決する…!
whereInRaw メソッドとか無い?とか謎の発想で検索してしまったので備忘録として書きました。