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

Symfony PHP Discussion :

Table jointure et persist cascade [2.x]


Sujet :

Symfony PHP

  1. #1
    Membre habitué
    Profil pro
    Développeur Web
    Inscrit en
    Avril 2010
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2010
    Messages : 141
    Points : 157
    Points
    157
    Par défaut Table jointure et persist cascade
    Bonjour,

    Je rencontre un petit souci à la définition de persist en cascade dans une table jointure entre deux entités "utilisateur" et "entreprise".

    J'ai donc mes deux entités sus-citées définies ainsi :

    Utilisateur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class Utilisateur extends BaseUser {
     
        /**
         * @var integer $id
         *
         * @ORM\Column(name="id", type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        protected $id;
    Entreprise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class Entreprise {
     
        protected $siret;
     
        /**
         * @var integer $id
         *
         * @ORM\Column(name="id", type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="AUTO")
         * 
         */
        private $id;
    Et enfin l'entité Utilisateur_Entreprise:
    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
    class Utilisateur_Entreprise
    {
        /**
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="AUTO")
         * @ORM\ManyToOne(targetEntity="Proetco\UserBundle\Entity\Utilisateur", inversedBy="entreprises", cascade={"persist"})
         * @Assert\Type(type="Proetco\UserBundle\Entity\Utilisateur")
         * @Assert\Valid
         */
        protected $utilisateur;
     
        /**
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="AUTO")
         * @ORM\ManyToOne(targetEntity="Proetco\FrontBundle\Entity\Entreprise", inversedBy="utilisateurs", cascade={"persist"})
         * @Assert\Type(type="Proetco\FrontBundle\Entity\Entreprise")
         * @Assert\Valid
         */
        protected $entreprise;
    Seulement, suite à un petit test pour vérifier le fonctionnement du persist :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
            $ue = new Utilisateur_Entreprise;
            $utilisateur = new Utilisateur;
            $entreprise = new Entreprise;
            $ue->setUtilisateur($utilisateur);
            $ue->setEntreprise($entreprise);
     
            $em = $this->getDoctrine()->getEntityManager();
            $em->persist($utilisateur);
            $em->persist($entreprise);
            $em->persist($ue);
    J'obtiens une erreur (j'ai juste supprimé les namespace et noms des bundles pour la lecture) du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Entity of type ***\Utilisateur_Entreprise has identity through a foreign entity ***\Utilisateur, however this entity has no ientity itself. You have to call EntityManager#persist() on the related entity and make sure it an identifier was generated before trying to persist '***Utilisateur_Entreprise'. In case of Post Insert ID Generation (such as MySQL Auto-Increment or PostgreSQL SERIAL) this means you have to call EntityManager#flush() between both persist operations.
    J'ai relu plusieurs fois la doc Doctrine sur les associations et les persist, et cela me semble pourtant correct. On peut bien l'utiliser ainsi?

    Merci d'avance pour votre aide.

  2. #2
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Points : 1 050
    Points
    1 050
    Par défaut
    Bonjour,

    /**
    * @ORM\Id
    * @ORM\GeneratedValue(strategy="AUTO")
    * @ORM\ManyToOne(targetEntity="Proetco\UserBundle\Entity\Utilisateur", inversedBy="entreprises", cascade={"persist"})
    */
    protected $utilisateur;
    Pourquoi mettre generatedValue à auto, une clé étrangère ne doit pas être auto-incrémenté.

    Le code de l'entité Utilisateur_Entreprise est-il complet?
    S'il n'a que deux attributs qui sont des clés étrangères, c'est une table de liaison qui n'a pas vocation à devenir une entité, il faut simplement faire une relation ManyToMany entre Entreprise et Utilisateur.

    Si tu as vraiment besoin de l'entité Utilisateur_Entreprise, il semble que ce ne soit pas possible de faire ceci avec un seul flush, il faut flusher utilisateur et Entreprise puis Utilisateur_Entreprise.
    d'aprés: http://groups.google.com/group/doctr...b15171ccd349e9

  3. #3
    Membre habitué
    Profil pro
    Développeur Web
    Inscrit en
    Avril 2010
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2010
    Messages : 141
    Points : 157
    Points
    157
    Par défaut
    J'avais lu la doc pour le GeneratedValue mais n'avait pas vu que MySQL interprétait cela comme un auto_increment.

    Il y a bien entendu d'autres propriétés dans Utilisateur_Entreprise et je ne peux juste la transformer en table de liaison.

    Bon donc impossible de faire cela sans 2 flush... Cette fonctionnalité n'est donc possible qu'avec des relations OneToMany, ManytoOne?

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

Discussions similaires

  1. Passage MCD vers MLD. Créer la table jointure.
    Par Oishiiii dans le forum PowerAMC
    Réponses: 6
    Dernier message: 24/03/2010, 21h49
  2. Plusieurs conditions sur une meme table (jointure)
    Par bugbug dans le forum Requêtes
    Réponses: 18
    Dernier message: 22/09/2009, 14h34
  3. [forms] Data Block Lov Plusieurs tables jointure
    Par loupin dans le forum Forms
    Réponses: 5
    Dernier message: 13/09/2006, 21h39
  4. Réponses: 14
    Dernier message: 05/09/2006, 17h01
  5. Create table + jointure
    Par ender999 dans le forum Débuter
    Réponses: 7
    Dernier message: 20/02/2004, 12h04

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