我有一些模型女巫使用学说nestedset特征。 我想因为这是我的应用程序需要从树中添加元素的删除functionaly。我是从文档片断尝试,但我得到一个非常奇怪的错误与代码。

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

和我这个代码在我的菜单类巫婆试图延伸产生抽象类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($项目)是一个trowing交战(使probabbly是原因奇怪的行为):

  

警告:get_class()预计参数   1为对象,在布尔...给出

不过,我需要一个解决方案,所有线索,欢迎...

有帮助吗?

解决方案

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

一个Doctrine_Record可以被删除,但是一个Doctrine_Node不能被删除 - 因为它不是持久的反正

在正确的逻辑将仅仅是:

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

此外,不要在你的模型“删除”名称的方法!这将覆盖Doctrine_Record的delete()方法,这将推动你疯了试图调试。

其他提示

我个人不喜欢使用Doctrine :: getTable(“表格名”),因为它不会使代码非常干燥。如果由于某种原因“表格名”都没有改变,你就必须改变它的地方很多。

我用学说在Zend框架的应用程序,所以我的典型的使用的模式涉及我的模块中的每个实例化模型的受保护的实例。

使用这种模式,我只想做我的控制器

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

答案就在你的问题:$项目不反对(我猜它的价值是假的,但你可以用var_dump($项目)),因为在DB(也是我猜你的$ id这样的ID没有行为null)

  
    

警告:get_class()预计参数1为对象,在布尔...给出

         

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

  
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top