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
コメント