wordpost
@wordpost
javascript vue.js

Вывод количество всех постов в родительской категории?

Подсткажите как вывести в веджете категорий количество постов цифрой, чтобы родительская категория учитывала и дочернии категории.
Вот есть виджет
class CategoriesWidget extends Widget
{
    /**
     * @var Category
     */
    public $category;
    public $posts_count;

    public function run()
    {
        $categories = Category::find()
            ->select(['{{%category}}.*', 'courses_count' => new Expression('COUNT(DISTINCT {{%post}}.id)')])
            ->joinWith(['posts'], false)
            ->groupBy('{{%category}}.id')
            ->orderBy('name')->all();

        $items = $this->getItemsRecursive($categories, null, $this->category);
        return $this->render('categories', [
            'items' => $items,
        ]);
    }

    /**
     * @var Category[] $categories
     * @param integer $parentId
     * @var Category $current
     * @return array
     */
    private function getItemsRecursive(&$categories, $parentId, $current)
    {
        $items = [];
        foreach ($categories as $category) {
            if ($category->parent_id == $parentId) {
                $items[] = [
                    'label' => $category->name,
                    'template' => '<a href="{url}" class="list-group-item">{label}<small class="badge">'.$category->posts_count.'</small></a>',
                    'url' => ['main/category', 'id' => $category->id],
                    'active' => $this->category && $category->id == $this->category->id ? true : null,
                    'items' => $this->getItemsRecursive($categories, $category->id, $current),
                ];
            }
        }
        return $items;
    }
}


Все выводится, но в родительской категории указаны только свои посты, а посты дочерних категорий не указаны, как вывести общее количество постов?
  • Вопрос задан
  • 144 просмотра
Пригласить эксперта
Ответы на вопрос 2
vyachin
@vyachin
Ищу работу
придется использовать рекурсию, но это большая нагрузка на базу. Можно конечно кешировать это значение. А можно добавить поле в категорию - кол-во постов и перерассчитывать его в триггере
Ответ написан
Комментировать
qonand
@qonand
Software Engineer
Есть несколько способов реализации Вашей задачи, что лучше - нужно определять в зависимости от специфики Вашей системы:
1. Рекурсивно вытаскивать данные из дочерних категорий. Этот вариант создаст много гемора и нагрузок
2. Пересчитывать кол-во постов на основе триггеров. Если резкое изменения родителя не планирует - это вполне пригодный вариант
3. Можно заджойнить эти данные. Если уровень вложенности минимальный - данный вариант вполне подойдет.
4. Можно использовать пересмотреть структуру хранения комментариев и использовать механизм nested sets или другие механизмы предназначенные для работы с вложенными данными
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы