addGlobalScope withCount关系的关系

时间:2017-05-16 07:20:03

标签: laravel laravel-5 eloquent laravel-5.4 laravel-eloquent

我有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

问题出在第三行。查询搞砸了,不知道关系有什么问题。

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