删除仅儿童教义2 symfony

时间:2019-02-26 14:34:13

标签: php symfony doctrine-orm

我正试图删除Child,但它也会删除其父级和所有其他子级 这是我的父实体:nononce

/**
     * @ORM\OneToMany(targetEntity="Candidature", mappedBy="annonce",orphanRemoval=true )
     */
    private $candidatures;

这是我的孩子实体:候选人身份

/**
     * @ORM\ManyToOne(targetEntity="Annonce", inversedBy="candidatures" )
     * @ORM\JoinColumn(name="id_annonce", referencedColumnName="id",nullable=false)
     */
    private $annonce;

这是我对父项的删除操作:

public function supprimerAction($id)
    {

        $em=$this->getDoctrine()->getManager();
        $annonce=$em->getRepository(Annonce::class)->find($id);
        $em->remove($annonce);
        $em->flush();
        return $this->redirectToRoute("mesAnnonces");
    }

这是我对子候选人的删除操作

 public function supprimerAction($id)
    {

        $em=$this->getDoctrine()->getManager();
        $candidature=$em->getRepository(Candidature::class)->find($id);
        $em->remove($candidature);
        $em->flush();
        return $this->redirectToRoute("mesCandidatures");
    }

1 个答案:

答案 0 :(得分:2)

您应该使用orphanRemoval而不是onDelete=CASCADE

因为Candidature::annonce不能为假,所以您永远不会有孤儿,这是不可能的。
您需要做的就是在删除相关的Candidature条目时从数据库中删除每个Annonce条目。
并且删除单个Candidature不会以这种方式影响父级Annonce

/**
 * @ORM\OneToMany(targetEntity="Candidature", mappedBy="annonce" )
 */
private $candidatures;

/**
 * @ORM\ManyToOne(targetEntity="Annonce", inversedBy="candidatures" )
 * @ORM\JoinColumn(onDelete="CASCADE", nullable=false)
 */
private $annonce;
  

在旁注中,我建议适当使用supprimerAction()
至少是这样的:

public function supprimerAction(Annonce $annonce) {
    $em=$this->getDoctrine()->getManager();
    $em->remove($annonce);
    $em->flush();

    return $this->redirectToRoute("mesAnnonces");
}

public function supprimerAction(Candidature $candidature) {
    $em=$this->getDoctrine()->getManager();
    $em->remove($candidature);
    $em->flush();

    return $this->redirectToRoute("mesCandidatures");
}

尽管如此,这还是不够的。
其中没有任何形式,也没有CSRF令牌。
这样会更安全:

public function supprimerAction(Request $request, Annonce $annonce) {
    $form=$this->createFormBuilder()
         ->setAction($this->generateUrl('annonce_supprimer', array('id'=>$annonce->getId())))
         ->setMethod('DELETE')
         ->getForm();

    $form->handleRequest($request);
    if($form->isSubmitted() && $form->isValid()) {
        $em=$this->getDoctrine()->getManager();
        $em->remove($annonce);
        $em->flush();

        return $this->redirectToRoute("mesAnnonces");
    }

    return $this->render('annonce_supprimer.html.twig', array(
        'annonce'=>$annonce,
        'form'=>$form,
    ));
}

public function supprimerAction(Request $request, Candidature $candidature) {
    $form=$this->createFormBuilder()
               ->setAction($this->generateUrl('annonce_supprimer', array('id'=>$candidature->getId())))
               ->setMethod('DELETE')
               ->getForm();

    $form->handleRequest($request);
    if($form->isSubmitted() && $form->isValid()) {
        $em=$this->getDoctrine()->getManager();
        $em->remove($candidature);
        $em->flush();

        return $this->redirectToRoute("mesCandidatures");
    }

    return $this->render('candidature_supprimer.html.twig', array(
        'candidature'=>$candidature,
        'form'=>$form,
    ));
}