イントロ
以前にLaravelのEloquentを使って、モデルから全部のデータを取得する方法をご紹介しました。
全部のデータではなくて、Eloquentに条件をつけて「一部の」データを取得するにはどんな方法があるのでしょうか。
今回はそちらをご紹介したいと思います。
本記事はLaravelドキュメントのデータベース:クエリビルダを噛み砕いて説明したものになります。
今回紹介するEloquentは厳密にはクエリビルダですが、各Eloquentはクエリビルダとして機能するため、本記事では便宜上Eloquentとしてご紹介させていただきます。
whereメソッドで条件を絞る
Eloquentに条件をつけてモデルを取得するときはwhereメソッドを使いましょう。
このwhereメソッドには3つの引数が必要です。
- カラムの名前
- 演算子
- カラムの値と比較する値
簡単に書くと以下です。
where(カラムの名前, 演算子, カラムの値と比較する値)
例えば、usersテーブルのvotes列の値が100に等しく、age列が35より大きいユーザーを取得する方法は以下です。
use App\Models\User;
$users = User::where('votes', '=', 100)->where('age', '>', 35)->get();
whereメソッド単体は条件を絞る機能しかないので、whereメソッドで条件を絞ったら最後はgetメソッドでデータを取得するのを忘れないようにしてください。
Laravelのドキュメントではいきなり条件を2つで絞っているが、where()やget()を繋げるときは->を書いて続ける。
また一般にメソッドが増えるにつれて1行で続けると長くて見えづらいことがあるので、見えやすくするために以下のように改行することも多いです。
$users = User::where('votes', '=', 100)
->where('age', '>', 35)
->get();
=の省略形
絞りたい条件が=であるときはwhereメソッドの省略形が使えて、=を書かなくてもOKです。
$users = User::where('votes', 100)->get(); // 2つ目の引数「=」を省略してもいい
whereメソッドを使った取得例
年齢が18歳以上で、性別が男のユーザーを取得
$users = User::where('age', '>=', 18)->where('sex', 'male')->get(); // 「=」の省略形を使っている
ステータスが公開済みで、公開日が2022年1月1日以降の記事を取得
$articles = Article::where('status', 'published')->where('published_at', '>=', '2022-01-01')->get();
他にもwhereメソッドに似たメソッドがたくさんあるよ
Laravelは非常に便利で多くのメソッドを用意しています。
「または」という条件を付与できるorWhereメソッドや、2つの値の間にある条件を加えるwhereBetweenメソッド、値がNULLの条件を加えるwhereNullメソッドなど、たくさんあります。
これらwhereの派生的なメソッドはこちらLaravelのドキュメントを見てみてください。