【Laravel】コレクションでorWhereをどう実現するか(OR条件で抽出)

こんにちは。今回は、LaravelのコレクションでOR条件で抽出する方法を解説します。非常に便利なLaravelのコレクションですが、OR条件でデータを絞り込む際に少し工夫が必要だったので記事にまとめました。

orWhereが存在しない

LaravelのコレクションにはWhereやWhereIn、WhereBetweenなどの多彩な抽出条件が存在し、それらをメソッドチェーンさせることでAND条件の検索が可能です。しかしOR条件を実現するためのWhereメソッドが存在しません。EloquentではorWhereという便利なメソッドがあったのですが、コレクションでは使うことが出来ません。

filterメソッドを使う

filterメソッドを使ってOR条件を実現する事ができます。まずはfilterの基本的な書き方から見ていきましょう。

filterはクロージャ(無名関数)を引数に取り、コレクションの要素を全件ループします。クロージャの中で要素の値を比較し、条件にヒットした場合はtrueを返すようにします。最終的にtrueの要素の集合が戻り値として返され、フィルターができるという仕組みです。

以下は2より大きい値を抽出する例です。

$collection = collect([1, 2, 3, 4]);

$filtered = $collection->filter(function ($value, $key) {
    return $value > 2;
});

$filtered->all();

// [3, 4]

基本がわかったところでOR条件の例を書いてみましょう。値が1もしくは2の要素を返します。

$collection = collect([1, 2, 3, 4]);

$filtered = $collection->filter(function ($value, $key) {
    return $value = 1 || $value = 2;
});

$filtered->all();

// [1, 2]

まとめ

LaravelのコレクションでOR条件検索をする方法を解説しました。私はWhereが使えないことに中々気づく事ができなかったので結構ハマってしまいました。私のような人が一人でも減れば良いと思って記事にしました。

Laravel

Posted by kobainmac