Удалить связанный объект после очистки связанных полей формы

1

У меня есть Company с отношениями " One-To-One с сущностью Manager. Для редактирования я использую компонент формы.
Когда я очищаю все поля Менеджера в форме - связанные поля БД также очищаются (но сама строка остается), что не является желательным поведением. В этом случае строка должна быть удалена из БД.
Как это можно достичь?

  • 0
    Это нормальное поведение, вы просто удаляете значения столбцов для этой строки ... Просто создаете кнопку удаления?
  • 0
    Я думал, что есть некоторая опция формы для удаления таких строк. Кнопка удаления - это слишком много работы, я думаю =) Это не коллекция, сущность Manager отображается как встроенная форма с двумя полями - кнопка удаления должна удалить эту форму из основной формы?
Теги:
symfony-forms

1 ответ

1
Лучший ответ

Это желаемое поведение, поскольку Doctrine является объектно-реляционным картоном. Если Manager все еще существует в вашей модели со всеми полями null он будет сохранен как строка таблицы с id и всем остальным полем null.

Тем не менее, вы можете легко добиться своего поведения в своей бизнес-логике. Простой подход заключается в том, чтобы:

public function setManager(Manager $manager = null) {
    $this->manager = $manager;
}

Обратите внимание, что важная часть - это не сам метод setter, а тот факт, что вы установили свойство null $this->manager. Затем в вашем контроллере выполните действия:

if ($form->isValid()) {
    if (<all properties are null>) {
        $entityManager->remove($company->getManager());
        $company->setManager(null);
    }
    // your other logic here
    $entityManager->persist($company);
    $entityManager->flush();
}

Конечно, это поставит некоторую логику контроллеру и не будет самым чистым методом, но станет хорошим началом. Когда вы получаете уверенность в Doctrine, вы можете реорганизовать удаление каскада и setManager(null) в EventListener, связанном с событием onFlush. Для этого см. Официальный документ.

  • 0
    Спасибо, по правде говоря, я надеялся, что есть некоторые настройки для такого удаления, вроде delete_if_empty , потому что я не хотел помещать дополнительную логику в контроллер или слушатель, так как чем меньше у вас кода, тем он понятнее =)
  • 0
    @basil В последней версии доктрины (особенно 2.5) у вас есть функция удаления сирот, которая позволит избежать необходимости вызывать метод удаления для entityManager. Но все же экземпляр сущности «менеджер» необходимо удалить из экземпляра «компания».
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню