我有3个型号:手机,产品和商店。
手机有许多属于商店的产品。
我正在尝试添加一个golbal示波器,以便每次加载手机时,产品和商店的数量都会自动加载。
products_count工作正常,但stores_count有点棘手,因为商店不是电话的关系,而是产品。
我尝试了以下但是它给了我一个错误"方法getRelated不存在。",我假设因为stores()现在返回一个集合。
关于如何添加stores_count的任何想法?
public static function boot(){
parent::boot();
static::addGlobalScope('products', function ($builder){
$builder->withCount('products');
$builder->withCount('stores'); <----- gives error
});
}
public function products(){
return $this->hasMany(Product::class);
}
public function stores(){
$store_ids = $this->products()->get(['store_id'])->unique();
return Store::find($store_ids);
}
@Sandeesh回答后更新。
我尝试使用hasManyThrough,但它返回一个错误的空集合。 当我dd($ phone-&gt;产品);我可以看到7种产品有3种不同的商店。
public function stores(){
return $this->hasManyThrough(Store::class, Product::class,
'store_id', 'id');
}
数据库架构
Phone
-id
Product
-id
-phone_id
-product_id
-store_id
Store
-id
更新2
所以我设法从上面的stores()方法获取生成的查询。
select `phones`.*,
(select count(*) from `products` where `phones`.`id` = `products`.`phone_id`) as `products_count`,
(select count(*) from `stores` inner join `products` on `products`.`id` = `stores`.`id` where `phones`.`id` = `products`.`store_id`) as `stores_count`
from `phones` where `slug` = ? limit 1
问题出在第三行。查询搞砸了,不知道关系有什么问题。
答案 0 :(得分:0)
您可以使用hasManyThrough
https://laravel.com/docs/5.4/eloquent-relationships#has-many-through
public function stores()
{
return $this->hasManyThrough(Store::class, Product::class);
}
修改
这应该可以满足您的需求。但渴望加载总是更好
protected $appends = [
'productCount',
'storeCount'
];
public function getProductCountAttribute()
{
return $this->products()->count();
}
public function getStoreCountAttribute()
{
return Store::whereIn('id', $this->products()->pluck('store_id')->toArray())->count();
}