清除相关表单字段后删除关联实体
Remove associated entity after clearing related form fields
我有 Company
个实体与 Manager
个实体有 One-To-One
关系。我使用表单组件进行编辑。
当我清除表单上所有经理的字段时 - 相关的数据库字段也被清除(但行本身仍然存在),这不是理想的行为。在这种情况下,必须从数据库中删除该行。
如何实现?
这是理想的行为,因为 Doctrine 是一个对象关系映射器。如果 Manager
仍然存在于所有字段 null
的模型中,它将被保存为 table 行,其中包含 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 有信心时,您可以重构级联删除和绑定到 onFlush
事件的 EventListener 中的 setManager(null)
。请参阅 official doc。
我有 Company
个实体与 Manager
个实体有 One-To-One
关系。我使用表单组件进行编辑。
当我清除表单上所有经理的字段时 - 相关的数据库字段也被清除(但行本身仍然存在),这不是理想的行为。在这种情况下,必须从数据库中删除该行。
如何实现?
这是理想的行为,因为 Doctrine 是一个对象关系映射器。如果 Manager
仍然存在于所有字段 null
的模型中,它将被保存为 table 行,其中包含 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 有信心时,您可以重构级联删除和绑定到 onFlush
事件的 EventListener 中的 setManager(null)
。请参阅 official doc。