LaravelのEloquentでWhere句を使う方法と、使用したパターンを6つ書いてみました!
サンプルコードについては、Laravelのバージョン8を使用して検証しています。
LaravelでWhereを使用して、データを取ってくる方法はシンプルです。
実際に使用する方法から見ていきましょう。
下記のmembersテーブルのデータを対象に解説します。
| id | name | gender | age | address | tel | deleted_at | created_at | updated_at |
|---|---|---|---|---|---|---|---|---|
| 1 | test1 | 0 | 20 | address1 | 08022098904 | NULL | 2021-11-08 04:55:43 | 2021-11-08 04:55:43 |
| 2 | test2 | 1 | 30 | address2 | 08044464106 | NULL | 2021-11-08 04:55:43 | 2021-11-08 04:55:43 |
| 3 | test3 | 0 | 29 | address3 | 08093529007 | NULL | 2021-11-08 04:55:43 | 2021-11-08 04:55:43 |
| 4 | test4 | 1 | 23 | address4 | 08062925312 | NULL | 2021-11-08 04:55:43 | 2021-11-08 04:55:43 |
| 5 | test5 | 0 | 36 | address5 | 08033662355 | NULL | 2021-11-08 04:55:43 | 2021-11-08 04:55:43 |
EloquentでWhere句を使う方法
Laravelでwhereを使う方法としては、作成したModelからwhereメソッドを使うと良いです。
例えば、Memberモデルを作っていた場合は、下記のようにwhereメソッドを使うことができます。
$member = Member::where('name', '=', 'test2')->first();
whereメソッドの第1引数のnameと書いている箇所はカラム名です。
第2引数の=はカラムに対しての比較演算子です。
イコール以外にも「!=」や「>」なども使えます。
第3引数はカラムと比較する値を入力します。
firstメソッドで、最初の1行を取得できます。データがなかったらnullが返ってきます。
結果として、membersテーブルのidが2のデータがMemberモデルのインスタンスとして取得できます。
カラムと比較して、同じものを取得したいだけの場合は、もっと簡潔に書くことが可能です。
$member = Member::whereName('test2')->first();
whereの後に、先頭大文字から記載したカラム名のメソッドが使えます。
上記は、先ほどと同じ意味になり、membersテーブルのnameカラムに対して”test2″の値のものを取得するという意味になります。
他のカラムでも下記のようにして、アクセスすることができます。
$member1 = Member::whereAge(29)->first();
$member2 = Member::whereAddress('address2')->first();
$member3 = Member::whereTel('08062925312')->first();
取得したデータはMemberモデルになっているので、それぞれのカラムに下記のようにアクセス可能です。
echo $member1->id; // 3
echo $member1->age; // 29
echo $member1->tel; // 08093529007
Where以外のEloquentの基本的な使用方法は、下記の記事に書きました。
LaravelでEloquentの使い方
複数のwhere句を付けたい
メソッドチェーンを使って複数書くと、条件が複数指定できます。
$member = Member::whereGender(1)->where('age', '>=', 30)->first();
echo $member->id; // 2
SQLをtoSqlメソッドで出力すると、下記のようになります。
whereでつけた条件が2つとも入っていることが確認できます。(and条件となります)
論理削除を設定している場合は、下記のようにdeleted_atカラムも勝手に参照されます。
select * from "members" where "gender" = ? and "age" >= ? and "members"."deleted_at" is null;
複数のデータを取得したい
firstメソッドではなく、getメソッドを使うと対象になった複数のデータを取得できます。
$members = Member::whereGender(1)->get();
取得したデータはCollection形式になり、複数のモデルが格納されている状態になります。
下記のようにすると、foreach文でループして取得した複数のデータを一件ずつ確認できます。
foreach ($members as $member) {
echo "id:{$member->id} name:{$member->name}";
}
genderが1のデータは2つなので、2回ループして、下記のように表示されます。
id:2 name:test2
id:4 name:test4
Where句に複数の値を指定したい(whereIn)
where句に複数の値を指定したい場合です。この時にはwhereInメソッドを使用します。
$members = Member::whereIn('id', [2, 3, 4])->get();
第1引数にカラム名で、第2引数に指定したい値を配列で指定します。
結果として、上記はIDが2,3,4の3件のデータが取得できます。
SQLを確認すると、下記のようになっています。
select * from "members" where "id" in (?, ?, ?) and "members"."deleted_at" is null;
or条件でwhere句を指定したい(orWhere)
先ほどwhereメソッドを重ねた場合は、and条件になっていました。
or条件にしたい場合は、orWhereメソッドを使用します。
$members = Member::whereGender(1)->orWhere('name', '=', 'test5')->get();
whereメソッドと同じように、「カラム名, 比較演算子, 値」で指定します。
結果として、genderが”1″でnameが”test5″のデータが返ってくるので、3件になります。
SQLを確認すると、下記のようになっています。
or句が使われていることが確認できました。
select * from "members" where ("gender" = ? or "name" = ?) and "members"."deleted_at" is null";
条件にデータベースの関数を使いたい(whereRaw)
DATEやSTRSUBなどデータベースの関数を、条件として使用したい場合です。
このような場合にはwhereRawメソッドを使用します。
$members = Member::whereRaw("SUBSTR(tel, 1, 3) = '080'")->get();
whereRawメソッドを使うと、引数として渡した文字列がwhere句の条件として、そのまま使用されます。
この例では、電話番号(tel)カラムの先頭から3文字が”080″で始まるものを取得しています。全てになるので5件返ってきます。
SQLを確認すると、下記のようになっています。
SUBSTRがSQLに含まれていることが、確認できます。
select * from "members" where SUBSTR(tel, 1, 3) = '080' and "members"."deleted_at" is null;
多用するとコードが見づらくなると思いますが、データベースの関数を使用したい場合には使うと良いかと思います。
or条件とand条件を一緒に付けたい
or条件とand条件を一緒に付けたい場合です。
whereメソッドにクロージャで条件を書くことによって、条件をネストしてつけることができます。
$members = Member::where('gender', '=', 1)
->where(function($query) {
$query->where('id', '=', 2)->orWhere('age', '=', 23);
})
->get();
whereメソッドにクロージャを上記のように書くことで、条件をネストして書くことができます。
上記のSQLの結果、2件取得できます。
SQLを確認すると、下記のようになっています。
クロージャに書いた内容が丸格好内にまとめられて、条件として使われていることが確認できました。
select * from "members"
where
"gender" = ?
and ("id" = ? or "age" = ?)
and "members"."deleted_at" is null
終わりに
Modelインスタンスから呼び出したメソッドで、where句が付けれることを確認しました。
そんなに難しくなく、シンプルに使っていけるかと思います。
今回は思いついたものを載せましたが、他にもいろんなメソッドがあるので、下記の公式のドキュメントの方も確認してみてください。
https://laravel.com/docs/8.x/queries

コメント