次のMySQLテーブルを使用して、ツリーを表すYiiのモデルがあります。
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 を超えており、必要に応じてユーザーによって更新されています。
ツリー/ページをより速く生成するにはどうすればよいですか?