首页 > 解决方案 > Laravel HasMany 反向关系问题

问题描述

让我们举个例子:

我有一个显示所有发票的页面。

网站管理员可以通过搜索他们的姓名或姓氏来过滤客户的结果。

发票型号

    public function clients()
{
    return $this->belongsTo('App\Client');
}

客户模型

    public function invoices() {

    return $this->hasMany('App\Invoice');
}

假设管理员想要按客户过滤发票,他输入例如“Jhon”

我的控制器:

1-选择名称 LIKE 'Jhon' 或姓氏 LIKE 'Jhon' 的客户

2- 如果 $query 返回一个包含很多客户名为 Jhon 的数组。

我将如何使用该关系为该客户获取发票???

标签: laraveleloquenthas-many

解决方案


您可以两种方式都这样做,具体取决于最适合的方式。

发票(哪里有):

Invoice::whereHas('client', function ($query){
    $query->where('name', 'like', 'Jhon')
        ->orWhere('lastname', 'like', 'Jhon');
})->get();

客户(flatMap + invoices 关系):

Client::where('name', 'like', 'Jhon')
    ->orWhere('lastname', 'like', 'Jhon')
    ->get()
    ->flatMap->invoices;

请记住,第二个选项会遭受 N+1 的影响,除非with('invoices')在执行查询之前调用 (->get());


推荐阅读