У меня есть модель в Yii, которая представляет дерево со следующей таблицей MySQL:
CREATE TABLE IF NOT EXISTS `nodes` ( `id` int(11) NOT NULL AUTO_INCREMENT, `node` varchar(255) NOT NULL, [ something more not necessary to display here ] `parentid` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`id`), ) ENGINE=InnoDB;
У меня есть следующие отношения для этой модели:
return array( 'parentnode'=>array(self::BELONGS_TO, 'Nodes', 'parentid'), 'childnode'=>array(self::HAS_MANY, 'Nodes', 'parentid'), );
Я использую CTreeView для отображения дерева. Построение исходного массива с итерацией всех узлов с помощью parentid = 0 рекурсивно с использованием $ model-> childnode. Это итерационная функция:
public static function nodetree($params) { //finds all top-level nodes $retval=array(); $nodes=Nodes::model()->findAllByAttributes(array('parentid'=>0)); foreach($nodes as $anode) $retval[]=Nodes::nodearray($anode, $params); }
Это функция рекурсии.
public static function nodearray($_node, $params) { // finds children $retval=array( 'text'=>$_node->node, //may differ based on options 'id'=>$_node->id, 'expanded'=>false, //may differ based on options 'children'=>array(), ); foreach ($_node->childnode as $c_node) $retval['children'][]=Nodes::nodearray($c_node, $params); return $retval; }
Вероятно, это не самый быстрый подход из-за накладных расходов Yii. Генерация страницы занимает более 1 секунды на сервере разработки без запуска другого приложения. Узлы больше 1K и обновляются пользователями по мере необходимости.
Как я могу сгенерировать дерево / страницу быстрее?