@andreysuha
Что то знаю

Как получить количество?

Есть кактегории сделаны по алгоритму 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. В какую сторону вообще копать?
  • Вопрос задан
  • 53 просмотра
Решения вопроса 1
@andreysuha Автор вопроса
Что то знаю
public function childrenDevices() {
        $categories = $this->descendants()->pluck("id");
        return Device::whereHas("categories", function ($query) use ($categories) {
            $query->whereIn("category_id", $categories);
        });
    }


Этот код работает корректно. Он проблема была в том что несколько категорий могут содержать один и тот же девайс.

SELECT DISTINCT `device_id` FROM `category_device` WHERE `category_id` in (3, 4, 5)


Вот этот запрос так же возвращает 49 результатов
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Fragster
@Fragster
помогло? отметь решением!
Не скажу за конкретно этот пакет, но по логике должно получиться что-то типа
select 
count(*) 
from products 
    inner join categories 
        on products.category_id = categories .id 
          and categories.left >= $left and categories.right <= $right

где $left и $right - поля от nested set текущей категории. ну и названия полей должны соответствовать тм, которые используются в пакете. Сделать это можно и через query builder
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы