Doctrine nestedset delete - PullRequest
       16

Doctrine nestedset delete

2 голосов
/ 12 февраля 2010

У меня есть несколько моделей, которые используют функцию Doctrine nestedset. Я хочу добавить функцию удаления элементов из дерева, так как это требуется в моем приложении. Я пытался использовать фрагменты из документации, но получаю очень странную ошибку с этим кодом.

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 для объекта, логическое значение задано в ...

Однако мне нужно решение для этого, и все советы приветствуются ...

Ответы [ 3 ]

0 голосов
/ 12 февраля 2010

Ответ на ваш вопрос: $ item не является объектом (я думаю, что его значение равно false, но вы можете использовать var_dump ($ item)), потому что в БД нет строки с таким идентификатором (также я предполагаю, что ваш $ id является нулевым)

Предупреждение: get_class () ожидает, что параметр 1 будет объектом, логическое значение задано в ...

Неустранимая ошибка: вызов функции-члена getNode () для необъекта

0 голосов
/ 27 февраля 2010

getNode () возвращает Doctrine_Node, а не Doctrine_Record.

Doctrine_Record может быть удален, но Doctrine_Node не может быть удален - потому что он все равно не является постоянным.

Правильная логика будет просто:

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

Кроме того, не называйте метод в вашей модели «delete» !! Это переопределит метод delete () Doctrine_Record, который сведет вас с ума, пытаясь его отладить.

0 голосов
/ 12 февраля 2010

Мне лично не нравится использовать Doctrine :: getTable ("table_name"), потому что это не делает код очень сухим. Если по какой-либо причине «table_name» когда-либо изменится, вам придется изменить его во многих местах.

Я использовал 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();
 }
...