Есть кактегории сделаны по алгоритму nested set через
пакет. Так же есть девайсы связаные с категориями отнощением многие-ко-многим. Для наглядности
public function devices() {
return $this->belongsToMany("App\Models\Device", "category_device", "category_id", "device_id");
}
Вопрос в том как получить девайсов во всех дочерних категория конкретной кактегори? Я понимаю что можно одним запросом получить всех детей, а потом для каждого ребенка получать количество его девайсов и просумировать. Как это сделать за найменьшее количество запросов?
UPD
Похоже что так можно сделать за два запроса
public function childrenDevices() {
$categories = $this->descendants()->pluck("id");
return Device::whereHas("categories", function ($query) use ($categories) {
$query->whereIn("category_id", $categories);
});
}
Код выше генерирует такой SQL
select * from `devices` where exists (select * from `categories` inner join `category_device` on `categories`.`id` = `category_device`.`category_id` where `devices`.`id` = `category_device`.`device_id` and `category_id` in (?, ?, ?) and `categories`.`deleted_at` is null) and `devices`.`deleted_at` is null
и если вызвать $category->childrenDevices()->count() возвращает 49 (Допустим у $category есть 3 потомка с id 3, 4, 5)
Но если проверить сколько связей у категорий
SELECT * FROM `category_device` WHERE `category_id` in (3, 4, 5)
То количество результатов 55. Так же в бд нету ни категорий ни девайсов помеченых как deleted_at. Так же если взять конкретно 3, 4, 5 категорию и для каждой отдельно вызвать $category->devices()->count() то сумма этих значений будет 55. В какую сторону вообще копать?