Php 嵌套集删除原则

Php 嵌套集删除原则,php,doctrine,hierarchical-trees,Php,Doctrine,Hierarchical Trees,我有一些模型正在使用嵌套集特性。 我想在功能上添加删除树中的元素,因为这在我的应用程序中是必需的。我曾尝试使用文档中的代码片段,但我在该代码中遇到了一个非常奇怪的错误 亚马尔在这里: 我正在我的菜单类中尝试使用这段代码,它扩展了生成的抽象类BaseMenu和BaseMenu扩展了Doctrine\u Record:) 无论如何,我的代码: public function getMenuItem($id) { return Doctrine::getTable('Menu')->

我有一些模型正在使用嵌套集特性。 我想在功能上添加删除树中的元素,因为这在我的应用程序中是必需的。我曾尝试使用文档中的代码片段,但我在该代码中遇到了一个非常奇怪的错误

亚马尔在这里:

我正在我的菜单类中尝试使用这段代码,它扩展了生成的抽象类BaseMenu和BaseMenu扩展了Doctrine\u Record:)

无论如何,我的代码:

 public function getMenuItem($id)
 {
     return Doctrine::getTable('Menu')->find($id);
 }

 public function delete($id)
 {
     $item = $this->getMenuItem($id);

     //echo get_class($item); will return Menu so object exists !?

     $item->getNode()->delete();
 }
我发现这是一个错误:

致命错误:调用成员函数 非对象上的getNode()

我刚刚注意到get_类($item)正在进行一场战争(所以这可能是这种奇怪行为的原因):

警告:get_class()需要参数 1为对象,布尔值在


然而,我需要一个解决方案,所有的提示都是受欢迎的…

我个人不喜欢使用条令::getTable(“table\u name”),因为它不会让代码变得非常枯燥。如果由于某种原因“表名”发生了变化,您将不得不在许多地方对其进行更改

我在Zend Framework应用程序中使用了条令,因此我的典型使用模式包括实例化模块中每个模型的受保护实例

使用这种模式,我只需在控制器中执行此操作

$this->_Menu
     ->getTable()
     ->find($id)
     ->getNode()
     ->delete();
如果你真的想保持你的函数相似,我会用这样的东西

 public function getMenuItem($id)
 {
     if (empty($id))
     {
         throw new Exception ("A parameter of id is required to retrieve a menu item".);
     }
     return $this->getTable()->find($id);
 }

 public function delete($id)
 {
     $item = $this->getMenuItem($id);

     if ($item instanceof Doctrine_Record == false)
     {
          throw new Exception("Item is not a valid Menu Record.");
     }

     $item->getNode()->delete();
 }

我个人不喜欢使用条令::getTable(“table_name”),因为它不会使代码非常枯燥。如果由于某种原因“表名”发生了变化,您将不得不在许多地方对其进行更改

我在Zend Framework应用程序中使用了条令,因此我的典型使用模式包括实例化模块中每个模型的受保护实例

使用这种模式,我只需在控制器中执行此操作

$this->_Menu
     ->getTable()
     ->find($id)
     ->getNode()
     ->delete();
如果你真的想保持你的函数相似,我会用这样的东西

 public function getMenuItem($id)
 {
     if (empty($id))
     {
         throw new Exception ("A parameter of id is required to retrieve a menu item".);
     }
     return $this->getTable()->find($id);
 }

 public function delete($id)
 {
     $item = $this->getMenuItem($id);

     if ($item instanceof Doctrine_Record == false)
     {
          throw new Exception("Item is not a valid Menu Record.");
     }

     $item->getNode()->delete();
 }

答案在您的问题中:$item不是object(我猜它的值是false,但您可以使用var_dump($item)),因为DB中没有这样id的行(我猜您的$id也是null)

警告:get_class()要求参数1为对象,布尔值在

致命错误:对非对象调用成员函数getNode()


答案在您的问题中:$item不是object(我猜它的值是false,但您可以使用var_dump($item)),因为DB中没有这样id的行(我猜您的$id也是null)

警告:get_class()要求参数1为对象,布尔值在

致命错误:对非对象调用成员函数getNode()

getNode()返回一个条令节点,而不是条令记录

可以删除条令记录,但不能删除条令节点——因为它无论如何都不是持久的

正确的逻辑应该是:

$item = $this->getMenuItem($id)->delete();
另外,不要在模型中命名方法“delete”!!这将覆盖Doctrine_Record的delete()方法,这将使您疯狂地尝试调试它。

getNode()返回一个Doctrine_节点,而不是Doctrine_记录

可以删除条令记录,但不能删除条令节点——因为它无论如何都不是持久的

正确的逻辑应该是:

$item = $this->getMenuItem($id)->delete();

另外,不要在模型中命名方法“delete”!!这将覆盖Doctrine_Record的delete()方法,这将使您疯狂地尝试调试它。

谢谢您的编码提示,但这并不能解决我的问题,因为我得到的异常项不是有效的菜单记录。你知道如何解决它以及为什么它根本不是一个Doctrine_记录吗?谢谢你的编码提示,但这并不能解决我的问题,因为我得到的异常项不是有效的菜单记录。你知道怎么解决它吗?为什么它根本不是一个教条记录?老兄,你读过我的问题吗!?我可以访问$item的所有属性。另外,get_class($item)返回的菜单yeap让人困惑,但菜单是类的,它看起来像一个对象:P,而且id肯定不是空的,因为我只是在测试应用程序,它不在某个实时网站或其他地方。那么,你怎么解释这个问题呢:致命错误:在非对象上调用成员函数getNode(),这让人困惑,因为我不知道错误在哪里。我不明白我是如何用这段代码访问对象属性的,比如$menu->title。由于我无法使其工作,您是否有一些带有嵌套集合树和删除函数的代码段?提供的代码是正确的。我只能建议您确保您的环境设置为错误报告(E_ALL);ini设置(“显示错误”,真);然后检查输出是否有错误。老兄,你看了我的问题了吗!?我可以访问$item的所有属性。另外,get_class($item)返回的菜单yeap让人困惑,但菜单是类的,它看起来像一个对象:P,而且id肯定不是空的,因为我只是在测试应用程序,它不在某个实时网站或其他地方。那么,你怎么解释这个问题呢:致命错误:在非对象上调用成员函数getNode(),这让人困惑,因为我不知道错误在哪里。我不明白我是如何用这段代码访问对象属性的,比如$menu->title。由于我无法使其工作,您是否有一些带有嵌套集合树和删除函数的代码段?提供的代码是正确的。我只能建议您确保您的环境设置为错误报告(E_ALL);ini设置(“显示错误”,真);并检查输出是否存在所有错误。