是否可以使用CakePHP Tree Behavior?从树中删除父节点。比方说,我有一个这样的节点:
<Node A>
- child 1 node A
- child 2 node A
- child 3 node A
- <Node B> (which is also a child 4 of Node A)
- child 1 node B
- child 2 node B
是否有可能获得Node A的所有chidren(使用chidren()或cakePHP中Tree行为的任何其他函数),但是从结果中排除一个有子节点的节点(在我们的例子中是节点B)?
请问好吗?
提前致谢
答案 0 :(得分:0)
你可以,但是你需要让你的手有点脏,因为我不认为这种行为允许这样的事情。
关键是所有没有子节点的节点都应该有一个left
和right
值。你需要发起这样的查询:
SELECT * FROM items WHERE left > (parent's left) AND right < (parent's right) AND right = left + 1 AND parent_id = (parent's ID)
这样我们就会要求所有返回的值都是父节点的子节点,并且它们的左右值是顺序的,如果节点有子节点,它们就不会出现。
答案 1 :(得分:0)
查看规范没有具体方法,因此您必须使用children()和childCount()为其构建自己的函数。这是代码模板(我不使用Cake PHP):
$children = <call TreeBehavior children() method with $id = id of Node A and $direct = true>;
$children_without_children = array();
foreach ($children as $child) {
if (<call TreeBehavior childCount() method with $id = $child->id and $direct = true> === 0) {
$children_without_children[] = $child;
}
}
然后$ children_without_children应该包含你想要的东西。
答案 2 :(得分:0)
您可以使用此代码:
$this->Node->removeFromTree($id, true);
答案 3 :(得分:0)
这是我的cakephp 2.x项目的代码:
public function delete($id = null) {
$this->ProductCategory->id = $id;
if (!$this->ProductCategory->exists()) {
throw new NotFoundException(__('Invalid product category'));
}
$this->request->allowMethod('post', 'delete');
if ($this->ProductCategory->removeFromTree($id, TRUE)) {
$this->Session->setFlash(__('The product category has been deleted.'));
} else {
$this->Session->setFlash(__('The product category could not be deleted. Please, try again.'));
}
return $this->redirect(array('action' => 'index'));
}
使用此方法(例如removeFromTree())将删除或移动节点,但保留其子树,该子树将重新设置一级。它提供了比delete更多的控制,对于使用树行为的模型,它将删除指定的节点及其所有子节点。