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();
}