我在 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 来显示树。使用 $model->childnode 递归地迭代所有 parentid=0 的节点来构建源数组。这是迭代函数:
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,并在需要时由用户更新。
如何更快地生成树/页面?