@MyNameIsSylor

Как в nestedset посчитать документы на каждом уровне, включая подуровни?

Задавался ли кто таким вопросом? Думаю ответы будут полезны не только мне.

на текущий момент догадался лишь до такого

private function _getCount($root=true){
        $criteria = new CDbCriteria();
        $criteria->addCondition('parent_id IS '.($root ? '' : ' NOT ').' NULL');
        $criteria->addCondition('category_id IN (
                SELECT
                  id
                FROM
                  forum_categories
                WHERE
                  _left >= :left
                  AND _right<= :right
                  AND _root= :root)'
        );
        $criteria->params[':left']   =   $this->_left;
        $criteria->params[':right']  =   $this->_right;
        $criteria->params[':root']   =   $this->_root;

        return YiiForumPost::model()->count($criteria);
    }

    public function getCountTopics(){
        return $this->_getCount();
    }
    public function getCountPosts(){
        return $this->_getCount(true);
    }


в данном примере в yii используется геттер countTopics(), countPosts()
при вызове одного из них происходит выборка всех веток текущего корня. затем просто считаются все документы в этих ветках.

при показе всего дерева, данный гетер будет вызываться в каждой строке, а это кол-во запросов равно кол-ву веток. что не очень хорошо )

есть ли какие еще идеи?

пока писал додумал денормализацию провести и хранить счетчики в доп поле категорий.
  • Вопрос задан
  • 2535 просмотров
Пригласить эксперта
Ответы на вопрос 1
pavel_salauyou
@pavel_salauyou
Symfony2 & Angular разработчик
счётчики нужно хранить в кеше (redis), а базу не трогать
Ответ написан
Ваш ответ на вопрос

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

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