【问题标题】:Laravel eloquent search query for two foreign tablesLaravel 雄辩的搜索查询两个外部表
【发布时间】: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() 仅适用于chargeswhereHas() 只检查子查询是否至少返回一个结果。您必须在 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.'%');但仍然出错

标签: laravel eloquent


【解决方案1】:

您可以关注documentation 向您的关系查询添加内容 (whereHas)。

所以,你应该有这个:

public function scopeSearch($query, $val){
    return $query->with(['user', 'customer'])
        ->whereHas('user', function($query) use ($val) {
            $query->where('tasks','like','%'.$val.'%')  
                ->Orwhere('name','like','%'.$val.'%');      
       })
       ->whereHas('customer', function($query) use ($val) {
           $query->where('name','like','%'.$val.'%');
       });
}

请注意,您仅将 whereHas 用于 users 而不是 customers...

【讨论】:

  • Still cant filter customer->'name' 从调试栏运行的查询是 select count(*) as aggregate from charges where exists (select * from customers where charges.@ 987654331@ = customers.id) 并且存在(从users 中选择*,其中charges.user_id = users.id 和(tasks,例如'340%vas%' 或@987 @ like '%vas%')) 它碰巧有相同的字段 'name' 用于搜索必须定义一个'name'来自用户表,另一个'name'来自客户,在查询中
  • 这不应该发生,因为您正在告诉每个查询该做什么。那我不确定,对不起:(
  • 你能解释一下那个查询是如何知道要搜索哪个表的吗? >Orwhere('name','like','%'.$val.'%')
  • 我不是 100% 确定,但它考虑到了关系名称,所以它将使用关系查询构建器来完成它(并且它已经拥有与此相关的所有信息关系表)。如果你看到source code,你会看到它会调用getRelationWithoutConstraints,那会调用$this->getModel()->{$relation}(),这是调用关系构建器的方式(获取与之相关的新查询)。
【解决方案2】:

终于成功了!经过一些研究,我发现问题出在我使用 of or 声明 上面的代码对我有用:

  public function scopeSearch($query, $val){
    return $query->whereHas('user', function($query) use ($val) {
        $query->where('tasks','like','%'.$val.'%')
                ->orWhere('name','like','%'.$val.'%');
    })
        ->orWhereHas('customer', function($query) use ($val) {
            $query->where('name', 'LIKE', '%'.$val.'%');
        })
        ->with('user', 'customer');
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-19
    • 2021-05-12
    • 2019-06-22
    • 2018-01-26
    • 2021-07-23
    • 2017-04-18
    相关资源
    最近更新 更多