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対多のテーブルがある前提で書いていきます。
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 検索をする方法についてまとめました。
誰かの参考になればと思います。