LaravelのCollectionでOR条件で抽出する方法を解説します。QueryBuilderみたいにDBから抽出後にソートしたり絞り込んだりできる非常に便利なCollectionですが、OR条件をするために少し工夫したので紹介します。
CollectionにはorWhereが存在しない
LaravelのEloquentにはorWhereが存在しますが、CollectionにはOR条件を表現するメソッドが存在しません。条件によってはwhereInやwhereBetweenといったメソッドで解決できますが、単純な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で調べたりして時間を取られたりしたので、覚えておくと良いと思います。
コメント