イントロ
以前に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のドキュメントを見てみてください。