在Laravel中的whereHas中使用when

时间:2018-12-17 20:30:19

标签: php laravel

我有以下查询:

return Expense::with('descriptions')
    ->when($this->string, function ($query) {
        return $query->where('name', 'LIKE', '%' . $this->string . '%');
    })
    ->orWhereHas('tags', function ($query) {
        $query->where('name', 'LIKE', '%' . $this->string . '%');
    })
    ->get();

我需要的是,以某种方式将whereHaswhen一起使用。如果$this->string为空,则不应使用whereHas。因为它将返回具有Tag这样的所有内容,所以我只需要在$this->string不为空的情况下运行它。

有什么干净的方法可以写吗?我不想使用if / else检查是否设置了$this->string,然后返回其他内容。

2 个答案:

答案 0 :(得分:3)

由于您的其中取决于外部变量,因此最好的方法是使用条件语句评估变量来构造查询。

不要害怕将查询的结构分成多个步骤,您不需要链接所有内容并返回它。

这样的可读性更强:

$builder = Expense::with('descriptions')
                ->where('name', 'LIKE', '%' . $this->string . '%');

if ($this->string) {
    $builder = $builder->whereHas('tags', function ($query) {
        $query->where('name', 'LIKE', '%' . $this->string . '%');
    });
}
return $builder->get();

答案 1 :(得分:1)

您想要这样的东西吗?

return Expense::with('descriptions')
    ->when(!empty($this->string), function ($query) {
        return $query->WhereHas('tags', function ($query) {
            $query->where('name', 'LIKE', '%' . $this->string . '%');
        })
    })
    ->get();