ひでメモ

プログラムについて勉強したことを書きます。たぶん。

【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]);

データベース:クエリビルダ 9.x Laravel

ドキュメントにも思っきり書いてますね… ドキュメント… やはりドキュメントはすべてを解決する…!

whereInRaw メソッドとか無い?とか謎の発想で検索してしまったので備忘録として書きました。