通过 Form EntityType Symfony3.4 从关系中取消链接时删除的实体
Entity deleted when unlinked from relation via Form EntityType Symfony3.4
我在某些实体中使用带有 softDeletable 模块的 Symfony3.4。
我有一个 ZoneMaterial 实体,其中包含两个 arrayCollection 实体:
/**
* @ORM\ManyToMany(targetEntity="EPC", cascade={"persist"}, orphanRemoval=true)
* @ORM\JoinTable(name="app_zone_material_epc",
* joinColumns={@ORM\JoinColumn(name="zoneMaterial_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="epc_id", referencedColumnName="id")}
* )
*/
private $epcs;
/**
* @ORM\ManyToMany(targetEntity="EPI", cascade={"persist"}, orphanRemoval=true)
* @ORM\JoinTable(name="app_zone_material_epi",
* joinColumns={@ORM\JoinColumn(name="zoneMaterial_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="epi_id", referencedColumnName="id")}
* )
*/
private $epis;
[...]
public function addEpc(EPC $e)
{
$this->epcs[] = $e;
}
public function removeEpc(EPC $e)
{
$this->epcs->removeElement($e);
}
public function getEpcs()
{
return $this->epcs;
}
public function addEpi(EPI $e)
{
$this->epis[] = $e;
}
public function removeEpi(EPI $e)
{
$this->epis->removeElement($e);
}
public function getEpis()
{
return $this->epis;
}
我link/unlink他们的表格定义如下:
->add('epcs', EntityType::class, array( 'label' =>'MPC',
'class' => 'AppBundle\Entity\EPC',
'query_builder' => function ($repository) use ($options) {
return $repository
->createQueryBuilder('a')
->orderBy('a.name', 'ASC');
},
'multiple' => true,
'expanded' => true))
->add('epis', EntityType::class, array( 'label' =>'EPI',
'class' => 'AppBundle\Entity\EPI',
'query_builder' => function ($repository) use ($options) {
return $repository
->createQueryBuilder('a')
->orderBy('a.name', 'ASC');
},
'multiple' => true,
'expanded' => true))
我的控制器中的 updateAction 函数如下所示:
public function updtZoneMaterialAction(Request $request, $id){
$doctrine = $this->getDoctrine();
$entityManager = $doctrine->getManager();
$zoneMaterial = $doctrine->getRepository(ZoneMaterial::class)->find($id);
$form = $this->createForm(ZoneMaterialType::class, $zoneMaterial);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
//Persist informations
$entityManager->persist($zoneMaterial);
$entityManager->flush();
//->redirection
}
//Render view
return $this->render('AppBundle:Zone:updt_zone_material.html.twig', array(
'form' => $form->createView(),
'id' => $id
));
}
softDeletable 扩展安装在我的两个实体 EPI 和 EPC 上,但似乎每次我 "unlink" 来自 ZoneMaterial 的 EPI 或 EPC 时,相关实体都会被删除(将 deletedAt 设置为 new DateTime("NOW")
).
each time I unlink an EPI or an EPC from a ZoneMaterial, the concerned entity is removed
这就是你通过配置orphanRemoval=true
告诉的教义。
orphan removal 的设置告诉 Doctrine 是否应该删除从聚合根中取消链接的实体。
这个概念非常强大,支持一种将持久性视为实现细节的编程形式。
与其手动告诉 ORM 必须删除一个实体,不如以这样一种方式对他们的域进行建模,即只需从集合中删除实体就足以自动同步数据库以反映模型的状态。
如果这不是您想要的,您不应将 orphanRemoval
设置为 true。
我在某些实体中使用带有 softDeletable 模块的 Symfony3.4。
我有一个 ZoneMaterial 实体,其中包含两个 arrayCollection 实体:
/**
* @ORM\ManyToMany(targetEntity="EPC", cascade={"persist"}, orphanRemoval=true)
* @ORM\JoinTable(name="app_zone_material_epc",
* joinColumns={@ORM\JoinColumn(name="zoneMaterial_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="epc_id", referencedColumnName="id")}
* )
*/
private $epcs;
/**
* @ORM\ManyToMany(targetEntity="EPI", cascade={"persist"}, orphanRemoval=true)
* @ORM\JoinTable(name="app_zone_material_epi",
* joinColumns={@ORM\JoinColumn(name="zoneMaterial_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="epi_id", referencedColumnName="id")}
* )
*/
private $epis;
[...]
public function addEpc(EPC $e)
{
$this->epcs[] = $e;
}
public function removeEpc(EPC $e)
{
$this->epcs->removeElement($e);
}
public function getEpcs()
{
return $this->epcs;
}
public function addEpi(EPI $e)
{
$this->epis[] = $e;
}
public function removeEpi(EPI $e)
{
$this->epis->removeElement($e);
}
public function getEpis()
{
return $this->epis;
}
我link/unlink他们的表格定义如下:
->add('epcs', EntityType::class, array( 'label' =>'MPC',
'class' => 'AppBundle\Entity\EPC',
'query_builder' => function ($repository) use ($options) {
return $repository
->createQueryBuilder('a')
->orderBy('a.name', 'ASC');
},
'multiple' => true,
'expanded' => true))
->add('epis', EntityType::class, array( 'label' =>'EPI',
'class' => 'AppBundle\Entity\EPI',
'query_builder' => function ($repository) use ($options) {
return $repository
->createQueryBuilder('a')
->orderBy('a.name', 'ASC');
},
'multiple' => true,
'expanded' => true))
我的控制器中的 updateAction 函数如下所示:
public function updtZoneMaterialAction(Request $request, $id){
$doctrine = $this->getDoctrine();
$entityManager = $doctrine->getManager();
$zoneMaterial = $doctrine->getRepository(ZoneMaterial::class)->find($id);
$form = $this->createForm(ZoneMaterialType::class, $zoneMaterial);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
//Persist informations
$entityManager->persist($zoneMaterial);
$entityManager->flush();
//->redirection
}
//Render view
return $this->render('AppBundle:Zone:updt_zone_material.html.twig', array(
'form' => $form->createView(),
'id' => $id
));
}
softDeletable 扩展安装在我的两个实体 EPI 和 EPC 上,但似乎每次我 "unlink" 来自 ZoneMaterial 的 EPI 或 EPC 时,相关实体都会被删除(将 deletedAt 设置为 new DateTime("NOW")
).
each time I unlink an EPI or an EPC from a ZoneMaterial, the concerned entity is removed
这就是你通过配置orphanRemoval=true
告诉的教义。
orphan removal 的设置告诉 Doctrine 是否应该删除从聚合根中取消链接的实体。
这个概念非常强大,支持一种将持久性视为实现细节的编程形式。 与其手动告诉 ORM 必须删除一个实体,不如以这样一种方式对他们的域进行建模,即只需从集合中删除实体就足以自动同步数据库以反映模型的状态。
如果这不是您想要的,您不应将 orphanRemoval
设置为 true。