【Laravel】EloquentでWHERE を a AND ( b OR c )でつなぐ方法

LaravelのEloquentを使ってANDと ORを使った複雑なSQLを表現する方法です。
SQLでのWHERE句で WHERE col1= 'val1' AND (col2 = 'val2' OR col3 = 'val3')をやってみます。
Model::where('col1', 'val1')->where(function ($q) {
    $q->where('col2', 'val2')
      ->orWhere('col3', 'val3');
});

 

whereメソッドにクロージャを渡しましょう。

コツはこれだけ。あとはwhereorWhereメソッド繋げば( where a or b)を表現することができます。

 

クロージャが入ると少し複雑な気もしますが、冷静にコードを見たらわかるはず。

なんからのパラメータを使いたい場合はuseを使えばよいです。

Model::where('col1', 'val1')->where(function ($q) use ($a, $b) {
    $q->where('col2', $a)
      ->orWhere('col3', $b);
});

わりと簡単ですよね。