ホーム > Laravel > Laravelで「AまたはB」のor検索をする方法【orWhere】
Laravel

Laravelで「AまたはB」のor検索をする方法【orWhere】

いつもご利用ありがとうございます。
この記事には広告が掲載されており、その広告費によって運営しています。

Laravel で「A または B」の or 検索をする方法についてまとめました。

はじめに

今回やることは、

Aまたは、Bのデータを取得する

例えば、

「ID が1」または、「ID が10」のユーザーを取得する

といった、どちらかの条件が満たされているデータを取得することができます。

Laravel 6 でも、Laravel 11 でも同じ書き方ができます。

結論 (ID 1 または、ID 10 のユーザーを取得する方法)

コントローラー

$users = User::where('id',1)
    ->orWhere('id',10)
    ->get();

このように where と orwhere をつなげることによって、

「ID が 1」または、「ID が 10」の2人のユーザーを取得することができます。

これを応用すると、カテゴリー1または、カテゴリー2を取得のような検索を実現することが可能です。

リレーションを含む orWhere

前提

1対多のテーブルがある前提で書いていきます。

larave where or

posts が 1 で tags が多となります。

//Post.php
public function tags()
{
    return $this->hasMany(Tag::class);
}

リレーションを含む orWhere の書き方

では、title または、リレーション先の tags に「Laravel」がある posts を取得してみます。

$string = 'Laravel';
$posts = Post::where('title',$string)
    ->orWhereHas('tags', function($query) use ($string) {
        $query->where('name', $string);
    })
    ->get();
dd($posts);

この中の use とは?

クロージャ(無名関数)の中で、外部スコープの変数を使用するために use を使います。

クロージャのスコープは外部の変数にアクセスできないため、use を使って明示的にその変数を渡す必要があります。

$string = 'Laravel';
$posts = Post::where('title',$string)
    ->orWhereHas('tags', function($query) {
        $query->where('name', $string); //useがないと未定義エラーになる。
    })
    ->get();
dd($posts);

Undefined variable $string

$query とは?

コールバック関数の引数です。

引数なので、$q でも何でも動きます。

今回はクエリビルダーが渡されるものなので、$queryなどクエリビルダと分かる書き方をするのが一般的で、ドキュメントにも$query と書いてあるので、$query を使うのが無難です。

$string = 'Laravel';
$posts = Post::where('title',$string)
    ->orWhereHas('tags', function($q) { //$qにしたら
        $q->where('name', $string); //$qで動く
    })
    ->get();

最初は難しいと思うので、ドキュメントの型のとおり書いて、書き方を覚えてしまえば良いと思います。

完全に理解したい人は、無名関数とコールバック関数で調べると良いと思います。

その他複雑な条件

AND 検索したいとき

Laravel で where 複数で AND 検索をする方法

A and (B or C)の検索をしたいとき

A かつ、B または C の検索をしたい時はこちらの記事で解説しています。

Laravel で複雑な条件検索、A and (B or C)を取得する方法

まとめ

Laravel で「A または B」の or 検索をする方法についてまとめました。

誰かの参考になればと思います。

フィードバックのお願い
この記事のフィードバックがありましたらYoutubeの適当な動画にコメントしていただいたり、お問い合わせからご連絡ください。