我有一些使用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是对象,布尔值在...中给出。
但是我需要一个解决方案,欢迎所有提示...
答案 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()方法,这会让你疯狂尝试调试它。