Doctrine嵌套集删除

时间:2010-02-11 22:44:02

标签: php doctrine hierarchical-trees

我有一些使用Doctrine嵌套功能的模型。 我想在树中添加删除功能,因为在我的应用程序中需要它。我正在尝试使用文档中的代码片段,但我发现该代码出现了一个非常奇怪的错误。

YAML在这里:http://pastie.org/820978

我正在尝试在我的Menu类中使用此代码扩展生成的抽象类BaseMenu和BaseMenu扩展Doctrine_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_class($ item)正在投掷战争(所以这可能是造成这种奇怪行为的原因):

  

警告:get_class()需要参数   1是对象,布尔值在...中给出。

但是我需要一个解决方案,欢迎所有提示...

3 个答案:

答案 0 :(得分:0)

我个人不喜欢使用Doctrine :: getTable(“table_name”),因为它不会使代码非常干燥。如果由于某种原因“table_name”发生变化,你将不得不在很多地方进行更改。

我在Zend Framework应用程序中使用了Doctrine,因此我的典型使用模式涉及实例化模块中每个模型的受保护实例。

使用该模式,我会在我的控制器中执行此操作

$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();
 }

答案 1 :(得分:0)

答案在你的问题中:$ item不是对象(我猜它的值是假的,但是你可以使用var_dump($ item)),因为在DB中没有这样的id的行(我猜你的$ id)是空的)

  
    

警告:get_class()期望参数1是对象,在...中给出布尔值

         

致命错误:在非对象

上调用成员函数getNode()   

答案 2 :(得分:0)

getNode()返回Doctrine_Node,而不是Doctrine_Record。

可以删除Doctrine_Record,但不能删除Doctrine_Node - 因为它无论如何都不会持久。

正确的逻辑就是:

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

另外,不要在模型'delete'中命名方法!!这将覆盖Doctrine_Record的delete()方法,这会让你疯狂尝试调试它。