在 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();
我有这两个模型:
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();