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引数にそのまま渡してしまうとfalse0の場合に検索自体が行われない。まあ当然なんだけど。

<?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']);
    });
}

# ...