【发布时间】:2021-04-12 20:12:44
【问题描述】:
我对上面的代码有疑问,我想用 2 个额外表中的条件进行搜索 我想要费用表中的“费用”,用户表中的“名称”以及客户表中的“名称” all 绑定了上述查询运行,但没有从客户那里获取数据->知道如何使它工作吗?
public function scopeSearch($query, $val){
return $query->has('customer')
->whereHas('user', function($query) use ($val) {
$query->where('tasks','like','%'.$val.'%')
->Orwhere('name','like','%'.$val.'%');
})
->with('user')
->with('customer');
}
【问题讨论】:
-
客户模型的受保护 $fillable 数组中是否有 'name' 元素?
-
“但不从客户->姓名获取数据”是什么意思?你的意思是,结果中的
customer关系没有被name过滤?嗯,那是因为whereHas()仅适用于charges。whereHas()只检查子查询是否至少返回一个结果。您必须在with()中应用相同的过滤器,方法是编写with([ 'customer' => function($query) { … } ]) -
我的意思是,我从问题中了解到,所有数据都在检索,但实际上不是客户的姓名。你的版本,和 Matias 的回答是微不足道的,所以我不认为可以在这里问这个问题:) 作为已经编写 whereHas('user', *) 函数的人,那么他也可以为客户这样做.我只是认为他可能忘记在 $fillable 数组中写入那个“名称”(因此它不是从 DB 中检索到的),这就是为什么我没有把它写成答案,因为它很简单。无论如何,他也可以通过 ->with('user.name') 做到这一点,但我认为这与问题无关)
-
@boolfalse 是的,它在可填充数组上的“名称”
-
@boolfalse 我也是这样做的 ->with('user.name') 但我收到错误>调用模型 [App\Models\User] 上的未定义关系 [name]。正如我在 matias 的回答中看到的那样,查询运行但仍然没有客户-> 过滤名称,因为我需要一种方法来定义来自客户表的“名称”或来自用户表的“名称”。我尝试了一些东西 ->Orwhere('customers.name','like','%'.$val.'%');但仍然出错