addGlobalScope withCount 关系的关系
addGlobalScope withCount relationship's relationship
我有 3 个模型:Phone、产品和商店。
A phone 有很多属于商店的产品。
我正在尝试添加一个全球范围,以便每次加载 phone 时,产品和商店计数都会自动加载。
products_count 工作正常,但是 stores_count 有点棘手,因为商店不是 Phone 的关系而是产品的关系。
我尝试了以下方法,但它给了我一个错误 "Method getRelated does not exist.",我假设是因为 stores() 现在 returns 一个集合。
关于如何添加 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 但它 returns 是一个错误的空集合。
当我 dd($phone->products);我可以看到 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
问题出在第三行。查询搞砸了,虽然不确定关系有什么问题。
您可以使用 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();
}
我有 3 个模型:Phone、产品和商店。
A phone 有很多属于商店的产品。
我正在尝试添加一个全球范围,以便每次加载 phone 时,产品和商店计数都会自动加载。
products_count 工作正常,但是 stores_count 有点棘手,因为商店不是 Phone 的关系而是产品的关系。
我尝试了以下方法,但它给了我一个错误 "Method getRelated does not exist.",我假设是因为 stores() 现在 returns 一个集合。
关于如何添加 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 但它 returns 是一个错误的空集合。 当我 dd($phone->products);我可以看到 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
问题出在第三行。查询搞砸了,虽然不确定关系有什么问题。
您可以使用 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();
}