我正试图删除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");
}
答案 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,
));
}