IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Doctrine2 PHP Discussion :

Suppression des relations Many to Many


Sujet :

Doctrine2 PHP

  1. #1
    Membre éclairé Avatar de Mangacker
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    452
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2006
    Messages : 452
    Par défaut Suppression des relations Many to Many
    Salut à tou(te)s,

    j'ai récemment repris l'apprentissage de Symfony2 et j'ai quelques soucis avec l'utilisation de Doctrine2.

    Voici mon problème.
    Pour la gestion de mes utilisateurs et rôles, j'ai décidé d'utiliser le célèbre FOSUserBundle. Tout va très bien pour la création des users, des groupes/rôles, et leur attribution aux différents users.

    Là où ça se corse, c'est lors de la suppression d'un groupe auquel sont déjà rattachés des users. J'obtiens l'erreur suivante :
    An exception occurred while executing 'DELETE FROM fos_group WHERE id = ?' with params {"1":8}:

    SQLSTATE[23000]: Integrity constraint violation: 1451 Cannot delete or update a parent row: a foreign key constraint fails (`symfony`.`fos_user_user_group`, CONSTRAINT `FK_B3C77447FE54D947` FOREIGN KEY (`group_id`) REFERENCES `fos_group` (`id`))
    Après quelques recherches sur le net, j'ai trouvé des solutions qui parlent de rajouter une option permettant la suppression en cascade, mais dans ma classe Group, je n'ai aucune liaison faite avec mes users, elle n'est présente que dans la classe User.

    Est-ce que quelqu'un aurait une piste pour moi?

    Le but étant que lors de la suppression d'un groupe, toutes les relations entre ce groupe et les utilisateurs soient supprimées mais tout en gardant les autres relations (du même utilisateurs vers d'autres groupes).

    Assez clair?

    User
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    /**
     * @ORM\Entity
     * @ORM\Table(name="fos_user")
     */
    class User extends BaseUser
    {
        /**
         * @ORM\Id
         * @ORM\Column(type="integer")
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        protected $id;
     
        /**
         * @ORM\ManyToMany(targetEntity="Tehem\UserBundle\Entity\Group")
         * @ORM\JoinTable(name="fos_user_user_group",
         *      joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
         *      inverseJoinColumns={@ORM\JoinColumn(name="group_id", referencedColumnName="id")}
         * )
         */
        protected $groups;
     
        public function __construct()
        {
            parent::__construct();
        }
     
        public function __toString()
        {
            return $this->getUsernameCanonical();
        }
    }
    Group
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    /**
     * @ORM\Entity
     * @ORM\Table(name="fos_group")
     */
    class Group extends BaseGroup
    {
        /**
         * @ORM\Id
         * @ORM\Column(type="integer")
         * @ORM\GeneratedValue(strategy="AUTO")
         */
         protected $id;
     
        public function __construct()
        {
            parent::__construct('', array());
        }
     
        public function __toString()
        {
            return $this->getName();
        }
    }
    GroupController (deleteAction)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $em = $this->getDoctrine()
                        ->getManager();
                    $em->remove($group);
                    $em->flush();
    Merci pour tout

  2. #2
    Membre éclairé Avatar de FadeToBlack
    Homme Profil pro
    ...
    Inscrit en
    Août 2010
    Messages
    320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : ...
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Août 2010
    Messages : 320
    Par défaut
    salut,

    si je comprends bien, tu voudrais qu'en cas de suppression d'un groupe, cela ne supprime pas les Users avec lesquels il était en relation ?.

    Avec une relation many to many tu te retrouves avec une table de liaison avec les clefs primaires de deux tables en relations.

    Si c'est le cas regarde le paragraphe 8.6 de la doc doctrine, cela va te donner une piste.

  3. #3
    Membre éclairé Avatar de Mangacker
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    452
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2006
    Messages : 452
    Par défaut
    Citation Envoyé par FadeToBlack Voir le message
    Si c'est le cas regarde le paragraphe 8.6 de la doc doctrine, cela va te donner une piste.
    Hello,
    oui je suis justement tombé sur ce genre d'articles, mais ce que je ne comprends pas, c'est comment renseigner cette relation dans ma classe Group.. En effet dans le FOSUserBundle, la liaison n'est déclarée que dans la classe User (qui possède une propriété groups) mais pas dans la classe Group (qui ne possède pas d'attribut users).

    As-tu une idée?

  4. #4
    Membre éclairé Avatar de FadeToBlack
    Homme Profil pro
    ...
    Inscrit en
    Août 2010
    Messages
    320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : ...
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Août 2010
    Messages : 320
    Par défaut
    En fait ce que tu veux c'est de créer une relation ManyToMany bi directionnelle.

    Dans la doc doctrine sur les associations mapping tu as un paragraphe sur cela.

    Tu auras un truc du genre :

    Entity User

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class User extends ......
    {
        // ...
     
        /**
         * @ManyToMany(targetEntity="Group", inversedBy="users")
         * @JoinTable(name="users_groups")
         */
        private $groups;
     
        public function __construct() {
            $this->groups = new \Doctrine\Common\Collections\ArrayCollection();
        }
    et Entity groupe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class Group extends ......
    {
        // ...
        /**
         * @ManyToMany(targetEntity="User", mappedBy="groups")
         */
        private $users;
     
        public function __construct() {
            $this->users = new \Doctrine\Common\Collections\ArrayCollection();
        }
    A partir de là tu peux gérer tes insertions, lectures , suppressions des deux cotés(dans les repositories), puisque les deux entités sont "propriétaires" de la relations.
    MAis il faut aussi gérer la façon dont chaque suppression, insertion va utiliser les cascades.


    Dans l'exemple tu as une table de liaison qui s'appelle Users_groups qui va recueillir les id_User et Id_group pour identifier les relations entre les différents User et les différents groups.

    Donc ce qu'il faut arriver à faire c'est à chaque suppression d'une des deux Entités (User et Group), on supprime les lignes correspondantes dans la table de liaison.

    Le tout c'est de savoir si tu veux garder un historique de la liaison :
    Est-ce qu'en cas de suppression d'un groupe, tu veux qu'un utilisateur sache qu'il a appartenu à un groupe supprimé.

    Plus concrètement, si tu as commandé un produit mais que ce produit n'existe plus dans la base. Est-ce que tu veux que dans tes historiques de commandes tu puisses voir que tu as acheté ce produit supprimé?

  5. #5
    Membre éclairé Avatar de Mangacker
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    452
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2006
    Messages : 452
    Par défaut
    Merci beaucoup c'est exactement ça qu'il me fallait

    Et non, dans ce cas, je ne veux pas garder la trace de la relation, mais qu'elle soit tout simplement supprimée.

    dans le cas où je voulais la garder, j'aurai du rajouter une condition persist?
    mais du coup, une fois l'entité supprimée, comment est ce que je peux garder cette trace? avec son id, je n'irai pas bien loin..

  6. #6
    Membre éclairé Avatar de FadeToBlack
    Homme Profil pro
    ...
    Inscrit en
    Août 2010
    Messages
    320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : ...
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Août 2010
    Messages : 320
    Par défaut
    N'oublie pas le RESOLU (pour les autres) si tu penses avoir trouvé ce qu'il te fallait

    Bon WE

  7. #7
    Membre éclairé Avatar de Mangacker
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    452
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2006
    Messages : 452
    Par défaut
    Citation Envoyé par FadeToBlack Voir le message
    N'oublie pas le RESOLU (pour les autres) si tu penses avoir trouvé ce qu'il te fallait

    Bon WE
    Oui oui ne t'en fais pas.. je pensais juste attendre une réponse avant de clore la discussion..

  8. #8
    Membre éclairé Avatar de FadeToBlack
    Homme Profil pro
    ...
    Inscrit en
    Août 2010
    Messages
    320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : ...
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Août 2010
    Messages : 320
    Par défaut
    Et tout fonctionne comme tu veux ?

  9. #9
    Membre éclairé Avatar de Mangacker
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    452
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2006
    Messages : 452
    Par défaut
    Citation Envoyé par Mangacker Voir le message
    Merci beaucoup c'est exactement ça qu'il me fallait

    Et non, dans ce cas, je ne veux pas garder la trace de la relation, mais qu'elle soit tout simplement supprimée.


    Ma question
    dans le cas où je voulais la garder, j'aurai du rajouter une condition persist?
    mais du coup, une fois l'entité supprimée, comment est ce que je peux garder cette trace? avec son id, je n'irai pas bien loin..

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. PGSQL-EclipseLink Relation One To Many et Many To One
    Par faitor1 dans le forum Persistance des données
    Réponses: 0
    Dernier message: 30/01/2015, 19h46
  2. Réponses: 5
    Dernier message: 04/10/2010, 12h28
  3. Problème de suppression des relations de table
    Par mouche dans le forum Access
    Réponses: 2
    Dernier message: 10/05/2007, 13h50
  4. Un peu de mal a comprendre le concepte "one-to-many" et "many-to-many"
    Par chriscoolletoubibe dans le forum Hibernate
    Réponses: 4
    Dernier message: 29/03/2007, 18h50
  5. Réponses: 1
    Dernier message: 03/12/2006, 20h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo