LaravelのQuery Builderでwhereをネストさせる際に変数を引き継ぐ

  • 2
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

laravelのQuery Builderはクロージャを用いて様々な表現ができるのですが、
https://laravel.com/docs/master/queries
引数の引き継ぎってできるんだっけ?と思いマニュアルを見たら記載がない。。。

一瞬焦りましたが、クロージャ(http://php.net/manual/ja/functions.anonymous.php) を使えるよ、と書いてあるので、もちろん使えます。

  $name = 'pika';
  $habitat = 'Viridian Forest';
  $rows = DB::table('box')
      ->where('type', self::WATER)
      ->where(function ($query) use ($habitat, $name) {
          $query->where('habitat', $habitat)
              ->orWhere(function ($query) use ($name) {
                  $query->Where('name', $pika);
                      ->where('is_alive', true)
              });
      });

こんな感じで書くと

select * from `box` where `type` = 5 and (`habitat` = 'Viridian Forest' or (`name` = 'pika' and `is_alive` = '1'));

こんな感じに発行されます。Rawで書いちゃう人もいるかもしれないですけど、一長一短な感じはしました。