我的Company
实体与One-To-One
实体的关系Manager
。为了编辑,我使用表单组件
当我清除表单上所有管理器的字段时 - 相关的数据库字段也被清除(但行本身仍然存在),这不是一个理想的行为。在这种情况下,必须从DB中删除该行
如何实现?
答案 0 :(得分: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
。请参阅official doc。