【问题标题】:Doctrine nestedset delete教义嵌套集删除
【发布时间】:2010-02-11 22:44:02
【问题描述】:

我有一些模型正在使用 Doctrine 嵌套集功能。 我想从树中添加元素的删除功能,因为这是我的应用程序所必需的。我正在尝试使用文档中的 sn-ps,但该代码出现了一个非常奇怪的错误。

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 为对象,布尔值...

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

【问题讨论】:

    标签: php doctrine hierarchical-trees


    【解决方案1】:

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

    可以删除 Doctrine_Record,但不能删除 Doctrine_Node -- 因为它不是持久的。

    正确的逻辑应该是:

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

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

    【讨论】:

      【解决方案2】:

      我个人不喜欢使用 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();
       }
      

      【讨论】:

      • 感谢编码提示,但这并不能解决我的问题,因为我收到异常项目不是有效的菜单记录。你知道如何解决它以及为什么它根本不是 Doctrine_Record 吗?
      【解决方案3】:

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

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

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

      【讨论】:

      • 老兄,你看我的问题了吗!?我可以访问 $item 的所有属性。还 get_class($item) 返回 Menu ,这很令人困惑,但 Menu 是类,它看起来像一个对象:P 而且肯定 id 不为空,因为我只是在测试应用程序,它不在某个实时网站或其他东西上。
      • 那么,你该如何解释:致命错误:在非对象上调用成员函数 getNode()
      • 老实说我无法解释,这很令人困惑,因为我不知道错误在哪里。我不明白如何使用此代码访问 $menu->title 等对象属性。你有一些带有嵌套集树和删除功能的sn-p,因为我无法让它工作吗?
      • 提供的代码是正确的。我只能建议您确保您的环境设置为 error_reporting(E_ALL); ini_set('display_errors', true);并检查所有错误的输出。
      猜你喜欢
      • 2020-11-26
      • 1970-01-01
      • 2015-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多