LoginSignup
4
3

More than 3 years have passed since last update.

Laravelの動的whereを活用する

Last updated at Posted at 2020-06-03

動的whereとは

LaravelのEloquentで条件を指定したい場合、通常は以下のように3つの引数(カラム名、演算子、値)を渡す必要があります。

//名前が「fuga」で、年齢が30歳のレコードを1件取得
Hoge::where('name', '=', 'fuga')->where('age', '=', 30)->first();

実はこのクエリ、以下のように書くこともできます。

Hoge::whereName('fuga')->whereAge(30)->first();

カラム名がメソッド名に吸収され、演算子も消え、引数は値だけになりました。
whereXxxx('fuga')というメソッド名にすることで、Xxxxの部分がカラム名に自動変換され、where('xxxx', '=', 'fuga')と同等に使うことができます。1
使える演算子は=のみですが、少しだけ行が短くなります。

応用

Andでカラム名をつなぎ、同じ数だけ引数に値を渡すことで、一つのメソッドで複数のカラムを対象にすることもできます。
以下のクエリも、冒頭のクエリと等価となります。

Hoge::whereNameAndAge('fuga', 30)->first();

AndではなくOrで繋ぐことで、OR条件にすることもできます。
同じカラム名でも大丈夫です。

Hoge::whereNameOrNameAndAge('fuga', 'piyo', 25)->first();

And|Orで繋いでいけば何個でもカラムを指定できます。
ただし、やりすぎるとむしろわかりにくくなるのでほどほどに。

注意点

対象のEloquentモデル、もしくはその祖先のクラスですでに定義済みのメソッドの場合、うまく動作しません。
例えば、\Illuminate\Database\Eloquent\BuilderにはwhereKeyというメソッドが存在するため、keyというカラムに対して、whereKeyという動的whereは使用できません。2
その場合は素直に通常の書き方をするか、Eloquentに独自のメソッドを定義してあげるのが良いでしょう。

また、whereXxxxというメソッドは当然実際には存在せず、動的に処理を行っているため、そのままだとIDEでエラーになります。
class HogeのPHPDocにちゃんとメソッドを追加してあげましょう。

/**
 * @method static \Illuminate\Database\Eloquent\Builder|\App\Eloquents\Hoge whereXxxx($value)
 */

  1. カラム名が複数語で構成されている場合はキャメルケースに変換して指定してください。 

  2. ほかのカラムとの組み合わせなら可能。whereKeyAndIdみたいな 

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3