簡體   English   中英

通過表單EntityType Symfony3.4與關系取消鏈接時刪除的實體

[英]Entity deleted when unlinked from relation via Form EntityType Symfony3.4

我在某些實體中將Symfony3.4與softDeletable模塊一起使用。

我有一個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;
}

我用如下定義的形式鏈接/取消鏈接它們:

    ->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上,但是似乎每次我從ZoneMaterial“取消鏈接” EPI或EPC時,都會刪除相關實體(將DeletedAt設置為new DateTime("NOW") )) 。

每次我從ZoneMaterial取消EPI或EPC的鏈接時,都會刪除相關實體

這是通過配置orphanRemoval=true告訴了學說的。

刪除孤兒的設置告訴Doctrine是否應刪除從其聚合根斷開鏈接的實體。

這個概念非常強大,可以實現一種將持久性視為實現細節的編程形式。 可以手動建模其域,而不是手動告知必須刪除實體的ORM,只需從集合中刪除實體就足以自動同步數據庫以反映模型狀態。

如果這不是您想要的,則不orphanRemoval設置為true。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM