カテゴリ: Laravel 更新日: 2026/02/02

Laravelで複数条件の絞り込みを行う方法(チェーン記法)完全ガイド

Laravelで複数条件の絞り込みを行う方法(チェーン記法)
Laravelで複数条件の絞り込みを行う方法(チェーン記法)

先生と生徒の会話形式で理解しよう

生徒

「Laravelでユーザーを検索するとき、名前と年齢など複数条件を組み合わせたい場合はどうしたらいいですか?」

先生

「Eloquentでは、チェーン記法を使うことで複数条件の絞り込みが簡単にできます。」

生徒

「チェーン記法って聞いたことがありますが、どういう意味ですか?」

先生

「チェーン記法とは、メソッドをつなげて連続で処理を行う方法です。EloquentではwhereorderByをつなげることで複雑な検索ができます。」

生徒

「具体的な例を見たいです!」

1. 複数条件を使った基本の絞り込み

1. 複数条件を使った基本の絞り込み
1. 複数条件を使った基本の絞り込み

例えば、ユーザー情報を管理するusersテーブルから「名前が田中で、年齢が20歳以上」のユーザーを取得したい場合、Eloquentでは次のように書きます。


use App\Models\User;

$users = User::where('name', '田中')
             ->where('age', '>=', 20)
             ->get();

ここで、whereを2回連続で書くことで、条件をANDでつなぐことができます。つまり、両方の条件を満たすユーザーだけが取得されます。

2. OR条件を使った複数条件の検索

2. OR条件を使った複数条件の検索
2. OR条件を使った複数条件の検索

場合によっては「名前が田中または名前が鈴木」のように、どちらかの条件に合うデータを取得したいことがあります。この場合はorWhereを使います。


$users = User::where('name', '田中')
             ->orWhere('name', '鈴木')
             ->get();

このように書くことで、田中または鈴木のどちらかの名前を持つユーザーが取得されます。

3. 条件をグループ化して複雑な検索を行う

3. 条件をグループ化して複雑な検索を行う
3. 条件をグループ化して複雑な検索を行う

さらに複雑な条件の場合、クロージャ(無名関数)を使って条件をグループ化できます。例えば「年齢が20歳以上で、名前が田中または鈴木」のユーザーを取得する場合は次のように書きます。


$users = User::where('age', '>=', 20)
             ->where(function($query){
                 $query->where('name', '田中')
                       ->orWhere('name', '鈴木');
             })
             ->get();

この書き方により、条件をグループ化して論理的に正しい検索ができます。

4. チェーン記法の便利さ

4. チェーン記法の便利さ
4. チェーン記法の便利さ

チェーン記法を使うと、複数のwhereorWhereorderByなどを連続でつなげることができます。これにより、コードがシンプルで見やすくなり、複雑な検索条件も整理しやすくなります。

例えば「20歳以上のユーザーで名前が田中または鈴木を年齢順で並べたい」ときも、次のように書けます。


$users = User::where('age', '>=', 20)
             ->where(function($query){
                 $query->where('name', '田中')
                       ->orWhere('name', '鈴木');
             })
             ->orderBy('age', 'asc')
             ->get();

5. 初心者でも押さえておきたいポイント

5. 初心者でも押さえておきたいポイント
5. 初心者でも押さえておきたいポイント

複数条件の絞り込みは、ユーザー検索や商品検索、ブログ記事のフィルターなどで頻繁に使います。Eloquentのチェーン記法を理解しておくことで、条件追加や順序指定が簡単になります。

最初はAND条件やOR条件の基本から始め、慣れてきたらクロージャを使った複雑な条件グループ化にも挑戦すると良いでしょう。こうした検索方法を覚えることで、より高度なデータ操作が可能になり、実務でも役立ちます。

また、メソッドチェーンでコードをつなげることにより、SQLを書かなくても直感的にデータベース検索ができるため、初心者でも扱いやすいのがEloquentの強みです。

まとめ

まとめ
まとめ

ここまで、LaravelのEloquent(エロクアント)を活用した複数条件の絞り込み方法について詳しく解説してきました。Webアプリケーション開発において、データベースから特定の条件に合致するデータを取り出す作業は避けて通れません。特にユーザー検索や商品一覧のフィルタリング、管理画面でのデータ抽出など、実務における活用シーンは多岐にわたります。

Laravelのチェーン記法が強力な理由

Laravelの最大の特徴の一つは、SQLを直接記述することなく、PHPのメソッドをつなげていく「メソッドチェーン(チェーン記法)」で直感的にクエリを構築できる点にあります。この手法を用いることで、ソースコードの可読性が飛躍的に向上し、後からコードを見返した際にも「どのような条件で検索しているのか」が一目で理解できるようになります。

例えば、複数の条件を順番に追加していくコードは、まるで英文を読んでいるかのような自然な流れになります。


// シンプルな複数条件(AND検索)の例
$results = User::where('status', 'active')
               ->where('role', 'admin')
               ->where('login_count', '>', 10)
               ->get();

上記のコードでは、「ステータスが有効」かつ「役割が管理者」かつ「ログイン回数が10回より多い」という3つの条件をANDで結合しています。これを素のSQLで書こうとすると、文字列の連結やバインド変数の考慮など、記述が煩雑になりがちですが、Laravelならこれだけで完結します。

さらに高度な検索テクニック:動的な絞り込み

実際のプロジェクトでは、検索フォームから送られてきた値があるときだけ条件を追加したい、といった動的な絞り込みが必要になることが多々あります。その場合、whenメソッドをチェーンに組み込むと、さらにスマートに記述できます。


$keyword = $request->input('keyword');

$users = User::where('is_active', true)
             ->when($keyword, function ($query, $keyword) {
                 return $query->where('name', 'like', "%{$keyword}%");
             })
             ->orderBy('created_at', 'desc')
             ->get();

この記述方法を覚えておくと、検索キーワードが入力されているときだけwhere句を追加するといった柔軟な対応が可能になります。if文を多用してクエリビルダを分割して書くよりも、メソッドチェーンの中で完結させる方が、Laravelらしい洗練されたコードと言えるでしょう。

複雑な論理構造とクロージャの活用

本記事の第3章でも触れましたが、where句の中にクロージャを渡すことで、SQLにおける「括弧 ()」で囲った条件グループを作ることができます。これは、AND条件とOR条件が混在する場合に、優先順位を明確にするために不可欠なテクニックです。

例えば、「退会していないユーザーの中で、(名前が"佐藤" または メールアドレスに"example.com"を含む)」という条件を考えた場合、以下のようなプログラムになります。


$users = User::where('deleted_at', null)
             ->where(function($query) {
                 $query->where('name', '佐藤')
                       ->orWhere('email', 'like', '%example.com%');
             })
             ->get();

このように、クロージャを使うことで、複雑な条件分岐も構造的に、かつ安全に構築できるのがEloquentの素晴らしい点です。

データベース操作のベストプラクティス

Laravelで複数条件の絞り込みを行う際は、以下のポイントを意識すると、より保守性の高いコードになります。

  • クエリスコープの活用: 頻繁に使う絞り込み条件(例:有効なユーザーのみなど)は、Modelクラス内にscopeActiveといった名前で定義しておくと、チェーンの中で->active()と呼び出せるようになり、再利用性が高まります。
  • ページネーションとの組み合わせ: 取得データが多い場合は、get()の代わりにpaginate(15)などを使うことで、簡単にページめくり機能を実装できます。
  • デバッグの習慣: 意図した通りに動かない場合は、チェーンの最後に->toSql()を付けて、実際に生成されているSQLを確認してみましょう。

Laravelの習得において、この「チェーン記法によるデータ操作」をマスターすることは、開発効率を劇的に向上させるための大きな一歩です。最初は基本のwhereから始め、徐々にorWhereやクロージャ、そしてwhenやクエリスコープへとステップアップしていきましょう。

先生と生徒の振り返り会話

生徒

「先生、まとめまで読んでみて、Laravelのチェーン記法がいかに強力かよく分かりました!メソッドをどんどんつなげていくだけで、複雑なSQLを自分で書かなくていいのは本当に助かります。」

先生

「その通りですね。特にPHPのコードとして自然に読めるのがEloquentの良いところです。今日学んだ中で、一番印象に残っている部分はどこですか?」

生徒

「やっぱり、第3章で教えてもらったクロージャを使ったグループ化です。最初はどうして関数の中にまた$queryが出てくるのか不思議だったんですが、SQLのカッコ () を作っているんだと理解したらスッキリしました!」

先生

「素晴らしい理解ですね。カッコの優先順位を間違えると、意図しないデータまで取得してしまったり、逆に必要なデータが漏れたりしますから、非常に重要なポイントです。ちなみに、実際に動かしてみた結果はどうでしたか?」

生徒

「はい、試しに自分の環境で実行してみたのですが、こんな感じで綺麗にデータが取れました!」


[
  {
    "id": 1,
    "name": "田中 太郎",
    "age": 25,
    "email": "tanaka@example.com"
  },
  {
    "id": 5,
    "name": "鈴木 一郎",
    "age": 30,
    "email": "suzuki@example.com"
  }
]

先生

「バッチリですね。意図通りに『20歳以上で、かつ田中または鈴木』という条件でフィルタリングできています。もし今後、もっと条件が増えてコードが長くなってきたら、どうすればいいか覚えていますか?」

生徒

「ええと、まとめに書いてあった『クエリスコープ』を使うんですよね!モデルの方に共通の検索ルールを書いておけば、コントローラーの中がもっとスッキリするって教わりました。」

先生

「その意気です!Laravelには、開発者が楽をできる仕組みがたくさん備わっています。最初は慣れないかもしれませんが、一つひとつのメソッドの意味を理解しながら書いていけば、必ず自由自在にデータを操れるようになりますよ。」

生徒

「ありがとうございます!次は、日付での絞り込みや、リレーション先のテーブル条件で絞り込む方法についても勉強してみたいです。Laravelって奥が深くて面白いですね!」

先生

「いい向上心ですね。その調子で頑張りましょう。複数条件のマスターは、Webサービス開発の土台になりますから、今回学んだことを忘れないように、色々なパターンで練習してみてくださいね。」

カテゴリの一覧へ
新着記事
New1
Symfony
Symfonyのコントローラで例外処理を追加する方法をやさしく解説!初心者でも安心して学べる
New2
Laravel
LaravelでEloquentのリレーションを扱う!withとloadで関連データを取得する方法
New3
Symfony
Twigとは?Symfony標準テンプレートエンジンの特徴と魅力を初心者向けに徹底解説
New4
Symfony
Symfonyでコントローラのコードをリファクタリングする方法をやさしく解説!初心者向けガイド
人気記事
No.1
Java&Spring記事人気No1
Laravel
Laravelでセッションを扱う方法!保存方法と利用例を解説
No.2
Java&Spring記事人気No2
Laravel
Laravelのコントローラとは?役割と使い方の基本を解説
No.3
Java&Spring記事人気No3
Laravel
LaravelでHello Worldを表示する方法を完全解説!初心者向けにルーティングと画面表示をやさしく説明
No.4
Java&Spring記事人気No4
Laravel
Laravelのマイグレーション履歴を確認する方法を徹底解説!migrate:statusの使い方
No.5
Java&Spring記事人気No5
Laravel
Laravelでメール送信付きの問い合わせフォームを作る方法
No.6
Java&Spring記事人気No6
Symfony
Symfonyのインストール方法!CLIとComposerの導入手順まとめ
No.7
Java&Spring記事人気No7
Laravel
Laravelのシングルアクションコントローラとは?使い方と利点
No.8
Java&Spring記事人気No8
Laravel
Laravelでログイン中ユーザー情報を取得する方法を完全解説!Auth::user()を初心者向けにやさしく説明