Laravel eloquent получает подсчет по идентификатору принадлежности

#laravel #eloquent #count #relationship

#laravel #eloquent #количество #отношение

Вопрос:

У меня есть 2 таблицы subscribers amp; subscriber_packages . Мне нужно получить количество активных в данный момент пакетов для выбранного subscriber через given subscriber_package / id .

Таблицы:

 # | subscriber_id | package_id | active
---------------------------------------
1 |             1 |          1 | true  
2 |             1 |          2 | true  
3 |             1 |          3 | true  
4 |             1 |          4 | false 
---------------------------------------
  

AppSubscriberPackage.php

 class SubscriberPackage extends Model
{
    public function subscriber()
    {
        return $this->belongsTo(Subscriber::class);
    }
    public function package()
    {
        return $this->belongsTo(Package::class);
    }

    public function _countActivePackages($subscriberPackage)
    {
        return self::where([
            'id'     => $subscriberPackage,
            'status' => Common::STATUS_ACTIVE,
        ])->whereHas('subscriber')->count();
    }
}
  

Комментарии:

1. Вы определили отношения в своих моделях подписчиков и пакетов с помощью pivot? И, пожалуйста, прочитайте о сводных моделях> laravel.com/docs/8.x /…

2. Да, отношения определены в обоих классах.

Ответ №1:

У вашего подписчика вам нужно правильно определить отношение hasManyThrough и просто правильно добавить причину where для проверки статуса даже в отдельном методе

     public function packages()
    {
        return $this->hasManyThrough(Package::class, SubscriberPackage::class);
    }

    public function activePackages()
    {
        return $this->packages()
            ->where("subscriber_package.status", "=", "active");
    }

  

После этого вы всегда можете сделать подсчет с его помощью

$subscriber->activePackages()->count();

Комментарии:

1. Я не на своем ноутбуке, поэтому вам может потребоваться настроить объявление отношения или причину where ..