http://www.yiiframework.com/extension/tree-extension/
这个tree扩展比较全,但我用的是老早的nestedset,升级比较痛苦,就添加了qq71151461的两个方法过来。在这里感谢qq71151461
这两个方法是实现重建树的功能。如果你原库是用parentId来做树的,想要左右值来做树,则可以用这两个方法建树。
TreeBehavior这个类添加
public $_parentIdCol = "parentId";
public function rebuildTree($parentId=0, $left=0) {
$right = $left+1;
$rows=$this->Owner->getDbConnection()->createCommand("SELECT `{$this->_idCol}` FROM `{$this->Owner->tableName()}` WHERE `{$this->_parentIdCol}`={$parentId}")->queryColumn();
foreach ($rows as $id) {
$right = $this->rebuildTree($id, $right);
}
$this->Owner->getDbConnection()->createCommand("UPDATE `{$this->Owner->tableName()}` SET `{$this->_lftCol}`={$left},`{$this->_rgtCol}`={$right} WHERE `{$this->_idCol}`=$parentId")->execute();
return $right + 1;
}
public function rebuildTreeLevel() {
$rows=$this->Owner->getDbConnection()->createCommand("SELECT `{$this->_idCol}`,`{$this->_lftCol}`,`{$this->_rgtCol}` FROM `{$this->Owner->tableName()}` ORDER BY `{$this->_lftCol}`")->queryAll();
foreach ($rows as $row) {
$level=$this->Owner->getDbConnection()->createCommand("SELECT COUNT(*) FROM `{$this->Owner->tableName()}` WHERE `{$this->_lftCol}`<={$row[$this->_lftCol]} AND `{$this->_rgtCol}`>{$row[$this->_rgtCol]}")->queryScalar();
$this->Owner->getDbConnection()->createCommand("UPDATE `{$this->Owner->tableName()}` SET `{$this->_lvlCol}`={$level} WHERE `{$this->_idCol}`={$row[$this->_idCol]}")->execute();
}
}
调用:
Model::model()->rebuildTree();
Model::model()->rebuildTreeLevel();