#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 ..