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 :

problème relation base de données [2.x]


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert

    Homme Profil pro
    développeur
    Inscrit en
    Octobre 2013
    Messages
    1 586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : développeur

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 586
    Par défaut problème relation base de données
    Bonjour j'ai encore un problème avec symfony si vous pouviez m'aider, j'ai deux orm emprunt et exemplaire un emprunt contient plusieurs exemplaires
    voici l'orm :
    exemplaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    manyToOne:
            emprunte:
                targetEntity: Emprunt
                inversedBy: exemplaires
                cascade: [ persist ]
    emprunt:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    oneToMany:
            exemplaires:
                targetEntity: Exemplaire
                mappedBy: emprunte
                orphanRemoval: true
    voici les methodes emprunt.php:
    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
    <?php
     
    namespace Bib\BiblioBundle\Entity;
     
    use Doctrine\ORM\Mapping as ORM;
     
    /**
     * Emprunt
     */
    class Emprunt
    {
        /**
         * @var integer
         */
        private $id;
     
        /**
         * @var \DateTime
         */
        private $dateDebut;
     
        /**
         * @var \DateTime
         */
        private $dateFin;
     
     
        /**
         * Get id
         *
         * @return integer 
         */
        public function getId()
        {
            return $this->id;
        }
     
        /**
         * Set dateDebut
         *
         * @param \DateTime $dateDebut
         * @return Emprunt
         */
        public function setDateDebut($dateDebut)
        {
            $this->dateDebut = $dateDebut;
     
            return $this;
        }
     
        /**
         * Get dateDebut
         *
         * @return \DateTime 
         */
        public function getDateDebut()
        {
            return $this->dateDebut;
        }
     
        /**
         * Set dateFin
         *
         * @param \DateTime $dateFin
         * @return Emprunt
         */
        public function setDateFin($dateFin)
        {
            $this->dateFin = $dateFin;
     
            return $this;
        }
     
        /**
         * Get dateFin
         *
         * @return \DateTime 
         */
        public function getDateFin()
        {
            return $this->dateFin;
        }
        /**
         * @var \Doctrine\Common\Collections\Collection
         */
        private $exemplaires;
     
        /**
         * @var \Bib\BiblioBundle\Entity\Inscrit
         */
        private $inscrit;
     
        /**
         * Constructor
         */
        public function __construct()
        {
            $this->exemplaires = new \Doctrine\Common\Collections\ArrayCollection();
        }
     
        /**
         * Add exemplaires
         *
         * @param \Bib\BiblioBundle\Entity\Exemplaire $exemplaires
         * @return Emprunt
         */
        public function addExemplaire(\Bib\BiblioBundle\Entity\Exemplaire $exemplaires)
        {
            $this->exemplaires[] = $exemplaires;
     
            return $this;
        }
     
        /**
         * Remove exemplaires
         *
         * @param \Bib\BiblioBundle\Entity\Exemplaire $exemplaires
         */
        public function removeExemplaire(\Bib\BiblioBundle\Entity\Exemplaire $exemplaires)
        {
            $this->exemplaires->removeElement($exemplaires);
        }
     
        /**
         * Get exemplaires
         *
         * @return \Doctrine\Common\Collections\Collection 
         */
        public function getExemplaires()
        {
            return $this->exemplaires;
        }
     
        /**
         * Set inscrit
         *
         * @param \Bib\BiblioBundle\Entity\Inscrit $inscrit
         * @return Emprunt
         */
        public function setInscrit(\Bib\BiblioBundle\Entity\Inscrit $inscrit = null)
        {
            $this->inscrit = $inscrit;
     
            return $this;
        }
     
        /**
         * Get inscrit
         *
         * @return \Bib\BiblioBundle\Entity\Inscrit 
         */
        public function getInscrit()
        {
            return $this->inscrit;
        }
     
    	 public function __toString() 
       { 
         return $this->id.'-'.$this->dateDebut.'.'.$this->dateFin; 
       }
    }
    ainsi que exemplaire.php:

    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
    <?php
     
    namespace Bib\BiblioBundle\Entity;
     
    use Doctrine\ORM\Mapping as ORM;
     
    /**
     * Exemplaire
     */
    class Exemplaire
    {
        /**
         * @var integer
         */
        private $id;
     
        /**
         * @var string
         */
        private $disponibilite;
     
     
        /**
         * Get id
         *
         * @return integer 
         */
        public function getId()
        {
            return $this->id;
        }
     
        /**
         * Set disponibilite
         *
         * @param string $disponibilite
         * @return Exemplaire
         */
        public function setDisponibilite($disponibilite)
        {
            $this->disponibilite = $disponibilite;
     
            return $this;
        }
     
        /**
         * Get disponibilite
         *
         * @return string 
         */
        public function getDisponibilite()
        {
            return $this->disponibilite;
        }
        /**
         * @var \Bib\BiblioBundle\Entity\Livre
         */
        private $livre_exemplaire;
     
     
        /**
         * Set livre_exemplaire
         *
         * @param \Bib\BiblioBundle\Entity\Livre $livreExemplaire
         * @return Exemplaire
         */
        public function setLivreExemplaire(\Bib\BiblioBundle\Entity\Livre $livreExemplaire = null)
        {
            $this->livre_exemplaire = $livreExemplaire;
     
            return $this;
        }
     
        /**
         * Get livre_exemplaire
         *
         * @return \Bib\BiblioBundle\Entity\Livre 
         */
        public function getLivreExemplaire()
        {
            return $this->livre_exemplaire;
        }
     
    	public function __toString()
    	{
    		return $this->disponibilite.'-'.$this->id.'-'.$this->getLivreExemplaire()->getTitre().'-'.$this->getLivreExemplaire()->getNotice();
    	}
    }
    le seul problème est que je veux récupérer la liste des emprunts pour un livre qui possède plusieurs exemplaire, mais dans emprunt je n'ai aucun id qui me rapporte à exemplaire juste à inscrit et dans exemplaire non plus j'ai juste un id qui rapporte à livre comment je peux donc mettre en relation les deux?

  2. #2
    Membre confirmé
    Inscrit en
    Mai 2010
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 52
    Par défaut
    Je n'ai pas regarde tes methods mais sachant en lisant ton post qu'il s'agit d'une relation 1-N bidirectionnelle certainement ou tu veux recuperer les objets proprietaires (emprunts) depuis l'objet inverse (livre) j'avais eu ce probleme quand j'avais developper un blog et par analogie je voulais recuperer les commentaires (emprunts) depuis un article (livre) et finalement je l'avais resolu en ecrivant une methode dans le repository de l'entite proprietaire (commentaire) de la relation donc inspire toi de cela en modifiant just ce qu'il faut etant donne que le schema de la relation est le meme que dans ton model ...
    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
     
    <?php
     
    namespace Rama\ProjectBundle\Entity;
     
    use Doctrine\ORM\EntityRepository;
     
    /**
     * CommentaireRepository
     *
     * This class was generated by the Doctrine ORM. Add your own custom
     * repository methods below.
     */
    class CommentaireRepository extends EntityRepository
    {
        public function commentairePourCetArticle($id)
        {
            $qb = $this->createQueryBuilder('c')
                        ->select('c')
                        ->where('c.article = :article_id')
                        ->setParameter('article_id', $id);
     
            return $qb->getQuery()->getResult();
        }
    }
    Et dans le controller tu recupere les entites proprietaire comment cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $list_entites = $em->getDoctrine()->getManager()->getRepository('RamaProjectBundle:Commentaire')->commentairePourCetArticle()
    Je tiens a t'informer qu'il existe une bonne pratique que cela. Celle-ci consiste a utiliser une methode presente dans l'entites inverse "getCommentaires()" dans mon cas mais pour je n'avais pas pu l'utiliser car je voulais gagner le temps.

    N'oublis pas de cliquer sur "ok" si ma reponse vous a aider je vous prie

  3. #3
    Membre Expert

    Homme Profil pro
    développeur
    Inscrit en
    Octobre 2013
    Messages
    1 586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : développeur

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 586
    Par défaut
    Merci de votre réponse,le problème c'est que je n'ai pas d'id dans ma table exemplaire dans emprunt ni celui de livre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    id
    inscrit_id
    date_debut
    date_fin
    donc même avec du dql si je ne peux pas comparer cela ne sert à rien auriez-vous une idée de comment faire regénérer les entité changer les relations?

  4. #4
    Membre Expert
    Avatar de pmithrandir
    Homme Profil pro
    Responsable d'équipe développement
    Inscrit en
    Mai 2004
    Messages
    2 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Responsable d'équipe développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 419
    Par défaut
    Si je résume, tu as :
    Livre - 1-n - Exemplaires - n-1 - Emprunt

    Tu veux faire l'équivalent de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT Emprunt.*
    FROM Livre l
    JOIN Exemplaires e
      ON l.id = e.livre_id
    JOIN Emprunt em
     ON e.emprunt_id = em.id
    Il te faut donc faire en doctrine dans ton repository LivreRepository
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     public function getEmprunts($livre_id) {
            $qb = $this->createQueryBuilder('l');
            $qb->select('em')
                    ->join('l.exemplaires', 'e')
                    ->join('e.emprunt', 'em')
                    ->where('l.id = :id')
                    ->setParameter('id', $livre_id);
            return $qb->getQuery()->getResult();
        }
    Quelque chose comme ca.

  5. #5
    Membre Expert

    Homme Profil pro
    développeur
    Inscrit en
    Octobre 2013
    Messages
    1 586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : développeur

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 586
    Par défaut
    Merci de votre réponse, mais dans la table emprunt je n'ai pas l'id d'exemplaire donc je ne peux pas comparer avec un where puisque celui-ci n'existe pas, j'ai regardé dans ma base j'ai seulement pour emprunt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    t id
    inscrit_id
    date_debut
    date_fin
    et pour exemplaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     id
    disponibilite
    livre_exemplaire_id
    pourtant j'ai mis les relations entre entités.

  6. #6
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    546
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 546
    Par défaut
    Je ne maitrise pas trop les déclaration ORM dans un fichier yaml à part...
    Si tu n'as pas le ID Emprunt dans la table Exemplaire, c'est que tu as mal définit tes relations entre entity, car doctrine aurait du te la faire tout seul...
    En mettant les infos doctrine en annotation j'aurai fait :
    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
     
    class Emprunt {
     
        /**
         * @var integer
         *
         * @ORM\Column(name="id", type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        private $id;
     
        /**
         * @var \Exemplaire
         * @ORM\OneToMany(targetEntity="AcmeBundle\Entity\Exemplaire", mappedBy="emprunt", cascade={"persist"})
         */
        private $exemplaires;
    }
     
    class Exemplaire {
     
        /**
         * @var integer
         *
         * @ORM\Column(name="id", type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        private $id;
     
        /**
         * @var \Emprunt
         * @ORM\ManyToOne(targetEntity="AcmeBundle\Entity\Emprunt", inversedBy="exemplaires")
         */
        private $emprunt;
    }

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

Discussions similaires

  1. [VB6]Débutant - Problèmes de base de données?
    Par steeves5 dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 08/06/2006, 22h05
  2. Problème conexion base de données MSSql DBE
    Par kaouane dans le forum Bases de données
    Réponses: 4
    Dernier message: 28/05/2006, 12h40
  3. Réponses: 3
    Dernier message: 27/04/2006, 15h21
  4. Problème accès base de données
    Par alainconnu dans le forum Outils
    Réponses: 3
    Dernier message: 27/04/2006, 09h31
  5. Problème Update Base de données avec les composants ADO
    Par lingli dans le forum Bases de données
    Réponses: 5
    Dernier message: 20/04/2006, 00h41

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