Doctrine nestedset удалить
-
20-09-2019 - |
Вопрос
У меня есть несколько моделей, которые используют функцию Doctrine nestedset.Я хочу добавить функцию удаления элементов из дерева, поскольку это требуется в моем приложении.Я пытался использовать фрагменты из документации, но я получаю очень странную ошибку с этим кодом.
ЯМЛ здесь: http://pastie.org/820978
И я пытаюсь с помощью этого кода в моем меню class witch расширить сгенерированный абстрактный класс 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 будет object, логическое значение задано в...
Однако мне нужно решение для этого, и все подсказки приветствуются...
Решение
getNode() возвращает Doctrine_Node, а не Doctrine_Record.
Doctrine_Record может быть удален, но Doctrine_Node не может быть удален - потому что он в любом случае не является постоянным.
Правильная логика была бы просто такой:
$item = $this->getMenuItem($id)->delete();
Кроме того, не называйте метод в вашей модели "удалить"!!Это переопределит метод doctrine_record's delete(), который сведет вас с ума, пытаясь его отладить.
Другие советы
Лично мне не нравится использовать Doctrine::GetTable("имя_таблицы"), потому что это не делает код очень сухим.Если по какой-то причине "имя_таблицы" когда-либо изменится, вам придется изменить его во многих местах.
Я использовал Doctrine в приложениях Zend Framework, поэтому мой типичный шаблон использования включает создание защищенного экземпляра каждой модели в моем модуле.
Используя этот шаблон, я бы просто сделал это в своем контроллере
$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();
}
Ответ содержится в вашем вопросе:$item не является объектом (я предполагаю, что его значение равно false, но вы можете использовать var_dump($item)), потому что в БД нет строки с таким идентификатором (также я предполагаю, что ваш $id равен null)
Предупреждение:get_class() ожидает, что параметр 1 будет object, логическое значение задано в...
Фатальная ошибка:Вызов функции-члена getNode() для не-объекта