動的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)
*/