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