Eloquentのwhen()で、偽になる可能性のある値の存在を条件に検索する
Eloquentというかクエリビルダ側の機能だけどまあ。
when()
はこのように使うことができ、条件分岐を何度も何度も書かなくて済む。
<?php use Illuminate\Database\Eloquent\Model; class Searchable extends Model # ... public function search($condition) { $this->when($condition['cond_1'] ?? false, function ($query, $cond_1) { $query->where('cond_1', $cond_1); }); } # ...
ただし、フラグや数量で検索したい場合、when()
の第1引数にそのまま渡してしまうとfalse
や0
の場合に検索自体が行われない。まあ当然なんだけど。
<?php # ... public function search($condition) { # $condition['boolean']が偽の場合、コールバック関数は実行されない $this->when($condition['boolean'] ?? false, function ($query, $boolean) { $query->where('boolean', $boolean); }); } # ...
どうするか。いろいろ考えたのだが、use
でコールバック関数に直接変数を渡してしまうのがよさそうだ。
<?php # ... public function search($condition) { # $condition['boolean']が設定されていてnullでなければ検索される $this->when(isset($condition['boolean']), function ($query, $boolean) use ($condition) { $query->where('boolean', $condition['boolean']); }); } # ...