[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で調べたりして時間を取られたりしたので、覚えておくと良いと思います。

著者

Webエンジニア歴30年、フリーランスバックエンドエンジニア。

PHP歴約30年(Laravel 7年・FuelPHP 5年・CakePHP・自作FW)、
JavaScript歴約20年(React・Vue各4年)。
AWS(EC2 / CloudFront / RDS / API Gateway など)・
GCP(BigQuery)を使ったバックエンド開発を中心に、
複数の事業会社・受託案件でシステム設計から実装・運用まで担当しています。

PHPがバージョン4の時代から書いており、
Laravelが普及する前のフレームワーク乱立期も経験しています。
「昔はこう書いていたが今はこう」という変遷を肌で知っているエンジニアとして、
単なるコマンドの使い方だけでなく、なぜそうするのかの背景まで伝えることを意識して書いています。

このブログでは、実務で実際に詰まった箇所・調べたこと・気づいたことを
そのまま記事にしています。誰かの「詰まり」が解決するきっかけになれば幸いです。

千原 耕司をフォローする

役にたったと思ったら応援をお願いします m(._.)m

Laravel
スポンサーリンク
シェアする
千原 耕司をフォローする
タイトルとURLをコピーしました