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 :

Problème nouvel enregistrement Many-To-One avec Doctrine2


Sujet :

Doctrine2 PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 7
    Par défaut Problème nouvel enregistrement Many-To-One avec Doctrine2
    Bonjour à vous tous,

    Je débute avec doctrine2 et ZF et j'ai un petit problème que je n’arrive pas à résoudre. Ça m’apparaît tout simple, mais je ne vois pas du tout.

    Voici, j'ai une table Users et un table Sex. La table sex contient les enregistrements des types de sexe possible pour un utilisateur.
    sexId | sexDesc | sexNbr
    1 | Homme | M.
    2 | Femme | Mme
    3 | Inconnu |

    Lorsque je veux insérer un nouvel utilisateur j'obtient toujours la même erreur: spl_object_hash() expects parameter 1 to be object, integer given

    Qu'est-ce qu'il ne va pas avec mon code? Pourriez-vous m'aider s'il vous plait?

    Voici ma classe Users
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    <?php
     
    namespace Bravo\Entity;
    use Doctrine\Common\Collections\ArrayCollection;
    /**
     * Users
     *
     * @Table(name="Users")
     * @Entity
     */
    class Users
    {
        /**
         * @var bigint $usersId
         *
         * @Column(name="users_id", type="bigint", nullable=false)
         * @Id
         * @GeneratedValue(strategy="IDENTITY")
         */
        private $usersId;
     
        /**
         * @var datetime $userMakeDate
         *
         * @Column(name="user_make_date", type="datetime", nullable=true)
         */
        private $userMakeDate; 
     
        /**
         * @var datetime $userUpDate
         *
         * @Column(name="user_up_date", type="datetime", nullable=true)
         */
        private $userUpDate;
     
        /**
         * @var string $userNbr
         *
         * @Column(name="user_nbr", type="string", length=23, nullable=true)
         */
        private $userNbr;
     
        /**
         * @var string $userFname
         *
         * @Column(name="user_fname", type="string", length=45, nullable=true)
         */
        private $userFname;
     
        /**
         * @var string $userName
         *
         * @Column(name="user_name", type="string", length=45, nullable=true)
         */
        private $userName;
     
        /**
         * @var string $userEmail
         *
         * @Column(name="user_email", type="string", length=60, nullable=true)
         */
        private $userEmail;
     
        /**
         * @var string $userPwd
         *
         * @Column(name="user_pwd", type="string", length=255, nullable=true)
         */
        private $userPwd;
     
        /**
         * @var string $userFonction
         *
         * @Column(name="user_fonction", type="string", length=60, nullable=true)
         */
        private $userFonction;
     
        /**
         * @var Address
         *
         * @ManyToMany(targetEntity="Address", inversedBy="users")
         * @JoinTable(name="userhasaddress",
         *   joinColumns={
         *     @JoinColumn(name="users_id", referencedColumnName="users_id")
         *   },
         *   inverseJoinColumns={
         *     @JoinColumn(name="enad_id", referencedColumnName="enad_id")
         *   }
         * )
         */
        private $enad;
     
        /**
         * @var Emails
         *
         * @ManyToMany(targetEntity="Emails", inversedBy="users")
         * @JoinTable(name="userhasemails",
         *   joinColumns={
         *     @JoinColumn(name="users_id", referencedColumnName="users_id")
         *   },
         *   inverseJoinColumns={
         *     @JoinColumn(name="emai_id", referencedColumnName="emai_id")
         *   }
         * )
         */
        private $emai;
     
        /**
         * @var Phones
         *
         * @ManyToMany(targetEntity="Phones", inversedBy="users")
         * @JoinTable(name="userhasphones",
         *   joinColumns={
         *     @JoinColumn(name="users_id", referencedColumnName="users_id")
         *   },
         *   inverseJoinColumns={
         *     @JoinColumn(name="phone_id", referencedColumnName="phone_id")
         *   }
         * )
         */
        private $phone;
     
        /**
         * @var Sex
         *
         * @ManyToOne(targetEntity="Sex")
         * @JoinColumns({
         *   @JoinColumn(name="sex_id", referencedColumnName="sex_id", nullable=false)
         * })
         */
        private $sex;
     
     
    	public function __construct() 
    	{
    		//$this->sex = new ArrayCollection();
     
    		// Initialisation des champs par default
    		$this->userMakeDate = new \Datetime(date('Y-m-d H:i:s'));
    		$this->userUpDate = new \Datetime(date('Y-m-d H:i:s'));
    		$this->userNbr = uniqid('u');
        }
     
     
    	public function __get($property)
        {
            return $this->$property;
        }
     
        public function __set($property,$value)
        {
            $this->$property = $value;
        }
     
    	// Définition des getters
    	public function getId() { return $this->usersId; }
        public function getMakeDate() { return $this->userMakeDate; }
    	public function getUpDate() { return $this->userUpDate; }
    	public function getNbr() { return $this->userNbr; }
    	public function getFname() { return $this->userFname; }
    	public function getName() { return $this->userName; }
    	public function getEmail() { return $this->userEmail; }
    	public function getPwd() { return $this->userPwd; }
    	public function getFonction() { return $this->userFonction; }
    	public function getSex() { return $this->sex; }
     
    	// Définition des setters
    	public function setMakeDate($value) { $this->userMakeDate = $value; }
    	public function setUpDate($value) { $this->userUpDate = $value; }
    	public function setNbr($value) { $this->userNbr = $value; }
    	public function setFname($value) { $this->userFname = $value; }
    	public function setName($value) { $this->userName = $value; }
    	public function setEmail($value) { $this->userEmail = $value; }
    	public function setPwd($value) { $this->userPwd = $value; }
    	public function setFonction($value) { $this->userFonction = $value;; }
    	public function setSex($value) { $this->sex = $value;; }
    }
    Voici ma class Sex
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    <?php
     
    namespace Bravo\Entity;
     
    /**
     * Sex
     *
     * @Table(name="Sex")
     * @Entity
     */
    class Sex
    {
        /**
         * @var bigint $sexId
         *
         * @Column(name="sex_id", type="bigint", nullable=false)
         * @Id
         * @GeneratedValue(strategy="IDENTITY")
         */
        private $sexId;
     
        /**
         * @var string $sexDesc
         *
         * @Column(name="sex_desc", type="string", length=45, nullable=true)
         */
        private $sexDesc;
     
        /**
         * @var string $sexNbr
         *
         * @Column(name="sex_nbr", type="string", length=4, nullable=true)
         */
        private $sexNbr;
     
    	// Définition des getters
    	public function getSexDesc() { return $this->sexDesc; }
        public function getSexNbr() { return $this->sexNbr; }
    	public function getSexId() { return $this->sexId; }
     
    	// Définition des setters
    	public function setSexDesc($value) { $this->sexDesc = $value; }
        public function setSexNbr($value) { $this->sexNbr = $value; }
     
     
     
    }
    Et mon test

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    <?php
     
    namespace Bravo\Entity;
     
    /**
     * Description of UsersTest
     *
     * @author frederick
     */
    class UsersTest extends \ModelTestCase {
     
    	public function testCanCreateUsers() {
    		$this->isInstanceOf('Bravo\Entity\Users', new Users());
    	}
     
    	public function testCanSaveNewUsersAndRetrieveThem() {
    		$em = $this->doctrineContainer->getEntityManager();
     
    		//Add Sex records
    		$sex1 = new Sex();
    		$sex1->setSexDesc('Homme');
    		$sex1->setSexNbr('M.');
     
    		$sex2 = new Sex();
                    $sex2->setSexDesc('Femme');
    		$sex2->setSexNbr('Mme');
     
    		$sex3 = new Sex();
                    $sex3->setSexDesc('Inconnu');
     
    		$em->persist($sex1);
    		$em->persist($sex2);
    		$em->persist($sex3);
    		$em->flush();
     
     
    		//Add User
     
    		$u = new Users();
     
    		$u->setFname('Dummy');
    		$u->setName('Inconnu');
    		$u->setEmail('dummy.inconnu@gmail.com');
    		$u->setPwd(md5('12345678'));
    		$u->setFonction('testeur professionnel');
     
    		$u->setSex(1);
     
    		$em->persist($u);
    		$em->flush();
     
     
    	}
     
     
    }
    Merci de prendre un peu de temps pour m'aider à trouver la lumière :-)

  2. #2
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 7
    Par défaut
    Je sais que mon problème met en cause la relation de la table Sex avec la table Users, mais je ne sais pas où chercher de ce coté. Les entités on été créées à partir de ma bdd mysql avec l'outil de doctrine:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ php doctrine orm:convert-mapping --from-database annotation /path/to/mapping-path-converted-to-annotation
    Je soupçonne mes annotations des classes Sex et Users de ne pas être correctes. Si quelqu'un avait une piste que je puisse explorer...

    Merci :-)

  3. #3
    Membre expérimenté
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2004
    Messages
    318
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2004
    Messages : 318
    Par défaut
    Salut.

    As-tu essayé de mettre simplement ceci ? Sinon petite parenthèse, la première ligne ici est inutile
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $sex1 = new Sex();
    $sex1 = $em->getRepository('Bravo\Entity\Sex')->find(1);

  4. #4
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 7
    Par défaut
    Merci beaucoup de m'aider.

    Je m’aperçois qu'il était tard quand j'ai envoyé sur le forum et j'avais copier le code de mon test dans son état, après avoir bidouiller quelques heures déjà. Désolé d'avoir induit en erreur.

    Alors je viens d'éditer et simplifier le code de mon test pour qu'il reflète ce que je veux faire:

    1. Je veux simuler que j'ai déjà une table Sex en inscrivant 3 enregistrements dans ma table Sex.
    2. Ensuite, je veux inscrire 1 enregistrement dans ma table Users dont le champs sex possède l'id de l'enregistrement 1 de la table Sex.


    Je travail en réfléchissant comme en SQL et j'ai l'impression que je me gourd.

    J'essai de suivre le stack mais je n'y comprend pas grand chose

    Je n'attend même pas une solution complète, juste une bonne piste qui m'aiderais

  5. #5
    Membre expérimenté
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2004
    Messages
    318
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2004
    Messages : 318
    Par défaut
    Oui effectivement il était tard

    Mais tu n'as pas répondu à ma seule question \o
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $u->setSex(1);
    // Essaie ceci à la place :
    $u->setSex($sex1);
    Honnêtement je n'ai pas lu ton mapping Doctrine, mais je pense que ca aurait râler ailleurs si problème il y a.
    Il faut effectivement que tu arrêtes de penser SQL, enfin beaucoup moins en tout cas. Mais ca va venir, c'est en pratiquant qu'on chope le coup de main.

  6. #6
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 7
    Par défaut
    Citation Envoyé par Guybrush113 Voir le message
    Oui effectivement il était tard

    Mais tu n'as pas répondu à ma seule question \o
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $u->setSex(1);
    // Essaie ceci à la place :
    $u->setSex($sex1);
    J'y crois pas!!! :-D

    C'est trop con, ça fonctionne!

    Merci énormément. Est-ce que je peux avoir une brève explication de ta solution?

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 10/08/2014, 17h25
  2. [Mapping] Relation <many-to-one> avec dans les 2 tables, 2 champs de noms différents
    Par thomas_31 dans le forum Hibernate
    Réponses: 3
    Dernier message: 26/09/2012, 15h14
  3. Update d'une collection many-to-one avec fetch=eager
    Par totoranky dans le forum Hibernate
    Réponses: 0
    Dernier message: 16/07/2010, 18h16
  4. [Data] erreur many to one avec hibernate et spring
    Par hanen14 dans le forum Spring
    Réponses: 2
    Dernier message: 13/04/2010, 13h37
  5. relation many-to-one avec clefs composites
    Par Foub dans le forum Hibernate
    Réponses: 2
    Dernier message: 27/09/2007, 14h33

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