LaravelでWhere句の使い方と使用パターン6つ!

Laravel Laravel

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

コメント

タイトルとURLをコピーしました