У меня есть Company
с отношениями " One-To-One
с сущностью Manager
. Для редактирования я использую компонент формы.
Когда я очищаю все поля Менеджера в форме - связанные поля БД также очищаются (но сама строка остается), что не является желательным поведением. В этом случае строка должна быть удалена из БД.
Как это можно достичь?
Это желаемое поведение, поскольку 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
. Для этого см. Официальный документ.
delete_if_empty
, потому что я не хотел помещать дополнительную логику в контроллер или слушатель, так как чем меньше у вас кода, тем он понятнее =)