2

我有一些模特正在使用 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 是对象,布尔值在...

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

4

3 回答 3

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();
 }
于 2010-02-12T00:13:46.777 回答
0

答案在您的问题中:$item 不是对象(我猜它的值是 false,但您可以使用 var_dump($item)),因为 DB 中没有具有此类 id 的行(我猜您的 $id 为空)

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

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

于 2010-02-12T20:28:37.127 回答
0

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

一个 Doctrine_Record 可以被删除,但是一个 Doctrine_Node 不能被删除——因为它无论如何都不是持久的。

正确的逻辑只是:

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

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

于 2010-02-27T00:52:49.997 回答