Salut tout le monde,
Je reviens en cette même journée avec un problème de suppression d'un groupe appartenant à une company.
Relation entre Groupe et Company : ManyToOne :

/**
     * @ORM\ManyToOne(targetEntity="App\Entity\Company", inversedBy="groups")
     * @ORM\JoinColumn(nullable=false)
     */
    private $company;

Voici le topo, nous sommes sur la page d'une Company. Celle ci contient des groupes qui lui sot associés.
Je peux créer des groupes et les modifier masi je ne peux pas les supprimer...c'est fort dommage :'(

Le message d'erreur qui s'affiche est le suivant :

An exception occurred while executing 'UPDATE groupe SET company_id = ? WHERE id = ?' with params [null, 10]:

SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'company_id' cannot be null

Entité Company en lien avec groups (qui fait référence à l'entité Groupe) :

/**
     * @ORM\OneToMany(targetEntity="App\Entity\Groupe", mappedBy="company", cascade={"remove"})
     */
    private $groups;

Entité Groupe en lien avec company (qui fait référence à l'entité Company) :

/**
     * @ORM\ManyToOne(targetEntity="App\Entity\Company", inversedBy="groups")
     * @ORM\JoinColumn(nullable=false)
     */
    private $company;

Le template qui envoie, via l'hyperlien, l'id de la company en question et du groupe en question :

<a href="{{ path('groupe.delete', {'id':company.id, 'group_id':group.id}) }}" class="m-2"><i class="gg-trash text-danger"></i></a>

Et la méthode deleteGroupe du controller :

/**
     * @Route("/company/{id}/deleteGroup/{group_id}", name="groupe.delete")
     * @ParamConverter("group", options={"id" = "group_id"})
     * @IsGranted("ROLE_ADMIN")
     */
    public function deleteGroup(Company $company, Request $request)
    {   
        $idg = $request->attributes->get('group_id'); // On récupère l'id du groupe
        $emi = $this->getDoctrine()->getManager();
        $group = $this->getDoctrine()->getRepository(Groupe::class)->findOneBY([
            'company' => $company->getId(),
            'id' => $idg
        ]);
        $company->removeGroup($group);
        $emi->flush();
        $this->addFlash('success', 'Le groupe a bien été supprimé avec succès');

        return $this->redirectToRoute('company.show', ['id' => $company->getId()]);
    }

Merci pour votre précieuse aide

3 réponses


GuillaumeGche
Auteur
Réponse acceptée

Pour ceux qui auront ce problème, la soluton est toute simple. Il faut ajouter : $emi->remove($group) après $company->removeGroup($group);

/**
     * @Route("/company/{id}/removeGroup/{group_id}", name="groupe.delete")
     * @IsGranted("ROLE_ADMIN")
     */
    public function deleteGroup(Company $company, Request $request)
    {   
        $idg = $request->attributes->get('group_id'); // On récupère l'id du groupe
        $emi = $this->getDoctrine()->getManager();
        $group = $this->getDoctrine()->getRepository(Groupe::class)->find($idg);
        $company->removeGroup($group);
        $emi->remove($group);
        $emi->flush();
        $this->addFlash('success', 'Le groupe a bien été supprimé avec succès');

        return $this->redirectToRoute('company.show', ['id' => $company->getId()]);
    }

J'ai également essayé de cette méthode :

     * @Route("/company/{id}/removeGroup/{group_id}", name="groupe.delete")
     * @ParamConverter("group", options={"id" = "group_id"})
     * @IsGranted("ROLE_ADMIN")
     */
    public function deleteGroup(Company $company, Request $request, Groupe $group, EntityManagerInterface $emi)
    {   
        $idg = $request->attributes->get('group_id'); // On récupère l'id du groupe
        $emi = $this->getDoctrine()->getManager();
        $group = $this->getDoctrine()->getRepository(Groupe::class)->find($idg);
        $company->removeGroup($group);
        $emi->flush();
        $this->addFlash('success', 'Le groupe a bien été supprimé avec succès');

        return $this->redirectToRoute('company.show', ['id' => $company->getId()]);
    }

Quand je met le joincolumn(nullable=true), la supression se fait bien mais seulement au niveau de la company, il reste dans ma bdd... :

/**
     * @ORM\ManyToOne(targetEntity="App\Entity\Company", inversedBy="groups")
     * @ORM\JoinColumn(nullable=true)
     */
    private $company;