通过 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。