在 Eloquent 中获取具有过滤地址的客户集合

Obtain customer collection with filtered addresses in Eloquent

我有这两个模型:

   customers(id,firstname,lastname,phone)
   addresses(id,province_id,address,customer_id)

关系:

 class Customer extends Model
 {

     public function addresses()
     {
         return $this->hasMany(Address::class);
     }
 }


 public function customer()
     {
         return $this->belongsTo(Customer::class,'customer_id');
     }

我正在努力获得 customers with address in certain city

  return new CustomerCollection(Customer::has('addresses')
                       ->with(array('addresses' => function($q) use ($field)
                        {
                          $q->where('province_id','like',$field)->get();

                        }))->orderBy('id','DESC')->paginate(100));

结果几乎没问题,当我只需要在给定省内有地址的客户时,我获得了所有客户的集合(坏),但地址数组只包含给定省内地址的数据。

怎么了?如何从结果中删除没有省内地址的客户?

    Customer::with('addresses')->whereHas('addresses', function ($q) use ($field) {
        return $q->where('province_id', 'like', '%'.$field.'%');
    })

您不需要在关系的嵌套查询中使用 get()like 语法在您的问题中也不正确。试试上面的解决方案

你试过了吗,如果你不打算在你的查询中提供 province_id 那么它会逃避条件并为你所有的客户提供那里的地址,如果你提供 province_id 你会得到唯一住在 provind_id

的顾客
Customer::query()->when($province_id,function($query){
            $query->whereHas('addresses', function($query) use($province_id){
                $query->where('province_id', $province_id);
            }); 
        })
        ->with('addresses')
        ->get();

更新:

class Customer extends Model
{
   
    public function scopeFilterByProvince($query, $provinceId = null)
    {
        return $query->when($province_id,function($query){
            $query->whereHas('addresses', function($query) use($province_id){
                $query->where('province_id', $province_id);
            }); 

       // if you pass name of province use this
       return $query->when($province,function($query){
            $query->whereHas('addresses', function($query) use($province){
                $query->whereHas('province', function($q) use($province){
                   $q->where('name', 'like', '%{$province}%');
               });
            }); 
    }
}

然后是控制器或你的仓库

Customer::filterByProvince($request->get('province_id'))
        ->with('addresses')
        ->get();