CakePHP:轻松复制/深度复制树结构?
我想知道有没有一种简单的方法来复制一个树结构,它由一个模型和一个作为树的父id组成 我在想,递归地遍历给定的树,删除所有ID和lft、rght字段应该很容易;但是,当我添加新字段时,parent_id将无法正确匹配。我想写我自己的函数来处理这个问题应该很容易,但我只是想知道是否已经有东西来处理这个问题了CakePHP:轻松复制/深度复制树结构?,cakephp,model,tree,orm,Cakephp,Model,Tree,Orm,我想知道有没有一种简单的方法来复制一个树结构,它由一个模型和一个作为树的父id组成 我在想,递归地遍历给定的树,删除所有ID和lft、rght字段应该很容易;但是,当我添加新字段时,parent_id将无法正确匹配。我想写我自己的函数来处理这个问题应该很容易,但我只是想知道是否已经有东西来处理这个问题了 谢谢 首先,我使用了Multi-Tree behavior(),因为它允许在一个表中管理多个树 我的示例可能有点复杂,并且与特定于应用程序的代码相混淆,但我相信您可以选择自己的方法来完成它 几乎
谢谢 首先,我使用了Multi-Tree behavior(),因为它允许在一个表中管理多个树 我的示例可能有点复杂,并且与特定于应用程序的代码相混淆,但我相信您可以选择自己的方法来完成它 几乎所有关于树的操作都需要一个递归的“树漫游器”。我编写了一个带有子任务等的任务管理器,这是我用来遍历树的方法的一个示例:
function _walkTasksTree($nodes, $model='Task')
{
foreach($nodes as $node)
{
$task = $node[$model];
$id = $task['id'];
$title = $task['name'];
$level = $task['level'];
$children = $this->_walkTasksTree($node['children'],$model);
if(empty($children))
{
$data[$id] = array('level'=>$level,'title'=>$title);
}
else
{
$data[$id] = array('level'=>$level,'title'=>$title,'children' => $children);
}
}
$data = (isset($data))?$data:array();
return $data;
}
我的应用程序有一个常见任务的“存储库”,可以将其克隆到项目中。基本模型是ProjectTask[1:1]ProjectTaskDescriptor——保存数据的描述符和保存树位置的任务。我使用此方法遍历和克隆树和/或分支
function _saveTaskTree($subTasks,$parent_id,$root_id,$projId,$exclude=null)
{
foreach($subTasks as $node)
{
if(@$exclude!=$node['Task']['id'])
{
$node['Task']['id'] = null;
$node['Task']['root_id'] = $root_id;
$node['Task']['parent_id'] = $parent_id;
$node['Task']['project_id'] = $projId;
$this->ProjectTask->create();
$saved = $this->ProjectTask->save($node['Task']);
$this->ProjectTaskDescriptor->create();
$PTD = $node['TaskDescriptor'];
$PTD['project_task_id'] = $this->ProjectTask->id;
$this->ProjectTaskDescriptor->save($PTD);
}
else
{
$saved = true; //skip the first one - we've already done it.
}
if($saved)
{
if(@$node['children'])
$children = $this->_saveTaskTree($node['children'],$this->ProjectTask->id,$root_id,$projId);
}
}
}
这是一个非常实用的过程,就未来对代码的理解和维护而言,完全理解正在发生的事情是值得的。我将在上午与您联系并给出示例!现在是午夜。啊,我明白了!是的,这很有道理,我脑子里也有同样的想法!我希望它已经自动化了。谢谢你的例子!