我有以下查询:
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();
我需要的是,以某种方式将whereHas
与when
一起使用。如果$this->string
为空,则不应使用whereHas
。因为它将返回具有Tag
这样的所有内容,所以我只需要在$this->string
不为空的情况下运行它。
有什么干净的方法可以写吗?我不想使用if / else检查是否设置了$this->string
,然后返回其他内容。
答案 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();