Удалить только для детей doctrine2 symfony - PullRequest
0 голосов
/ 26 февраля 2019

Я пытаюсь удалить Child, но он также удаляет своего родителя и всех других потомков. Вот мой родительский объект: annonce

/**
     * @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 голосов
/ 26 февраля 2019

Вместо 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,
    ));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...