[Laravel]CollectionでOR条件を実現する方法

Laravel Laravel

LaravelのCollectionでOR条件で抽出する方法を解説します。QueryBuilderみたいにDBから抽出後にソートしたり絞り込んだりできる非常に便利なCollectionですが、OR条件をするために少し工夫したので紹介します。

CollectionにはorWhereが存在しない

LaravelのEloquentにはorWhereが存在しますが、CollectionにはOR条件を表現するメソッドが存在しません。条件によってはwhereInwhereBetweenといったメソッドで解決できますが、単純なOR条件は存在しませんでした。

例えば、個数が10個以上または総額1万円以上の注文を抽出したいなど、OR条件を使いたいケースは様々あると思います。

OR条件を実現する方法

filterメソッドを利用する

filterメソッドを利用して、OR条件を実現することができます。

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

$result = $collection->filter(function ($value, $key) {
    // 条件にマッチするものを
    return $value === 2 || $value === 4;
});

$result->all();
// [1 => 2, 3 => 4]

filterメソッドは全件ループして、引数のクロージャ(無名関数)の結果がtrueだったもののみを抽出します。上記例では、値が2または4の場合にtrueとなるので、結果も2と4が取得できています。

単純な条件であれば、アロー関数を利用して簡潔に書くこともできます。

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

$result = $collection->filter(fn ($value, $key) => $value > 2 );

$result->all();
// [2 => 3, 3 => 4]

まとめ

LaravelのCollectionでOR条件で検索する方法を解説しました。エディタのサジェストでorWhereが出てこなかったので、公式のCollectionで調べたりして時間を取られたりしたので、覚えておくと良いと思います。

コメント

タイトルとURLをコピーしました