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 :

Afficher les relations many to many


Sujet :

Doctrine2 PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Août 2002
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 94
    Par défaut Afficher les relations many to many
    J'aimerais afficher les résultats de deux tables reliés entre elles par une jointure Many to Many.

    Voici ma première table:
    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
     
    <?php
     
    namespace Essai\ManyBundle\Entity;
     
    use Doctrine\ORM\Mapping as ORM;
     
    /**
     * Essai\ManyBundle\Entity\Proprietaire
     *
     * @ORM\Table()
     * @ORM\Entity(repositoryClass="Essai\ManyBundle\Entity\ProprietaireRepository")
     */
    class Proprietaire
    {
        /**
         * @var integer $id
         *
         * @ORM\Column(name="id", type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        private $id;
     
        /**
         * @var string $nom
         *
         * @ORM\Column(name="nom", type="string", length=255)
         */
        private $nom;
     
        /**
         * @var string $prenom
         *
         * @ORM\Column(name="prenom", type="string", length=255)
         */
        private $prenom;
     
        /**
         * @ORM\ManyToMany(targetEntity="Autre",inversedBy="proprietaires")
         * @ORM\JoinTable(name="proprietaire_autres")
         * @ORM\JoinColumn(name="autres_id", referencedColumnName="id")
         */
        private $autres;
     
     
        /**
         * Get id
         *
         * @return integer 
         */
        public function getId()
        {
            return $this->id;
        }
     
        /**
         * Set nom
         *
         * @param string $nom
         */
        public function setNom($nom)
        {
            $this->nom = $nom;
        }
     
        /**
         * Get nom
         *
         * @return string 
         */
        public function getNom()
        {
            return $this->nom;
        }
     
        /**
         * Set prenom
         *
         * @param string $prenom
         */
        public function setPrenom($prenom)
        {
            $this->prenom = $prenom;
        }
     
        /**
         * Get prenom
         *
         * @return string 
         */
        public function getPrenom()
        {
            return $this->prenom;
        }
        public function __construct()
        {
            $this->autres = new \Doctrine\Common\Collections\ArrayCollection();
        }
     
        /**
         * Add autres
         *
         * @param Essai\ManyBundle\Entity\Autre $autres
         */
        public function addAutre(\Essai\ManyBundle\Entity\Autre $autres)
        {
            $this->autres[] = $autres;
        }
     
        /**
         * Get autres
         *
         * @return Doctrine\Common\Collections\Collection 
         */
        public function getAutres()
        {
            return $this->autres;
        }
    }
    Et la deuxieme:

    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
     
    <?php
     
    namespace Essai\ManyBundle\Entity;
     
    use Doctrine\ORM\Mapping as ORM;
     
    /**
     * Essai\ManyBundle\Entity\Autre
     *
     * @ORM\Table()
     * @ORM\Entity(repositoryClass="Essai\ManyBundle\Entity\AutreRepository")
     */
    class Autre
    {
        /**
         * @var integer $id
         *
         * @ORM\Column(name="id", type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        private $id;
     
        /**
         * @var string $adresse
         *
         * @ORM\Column(name="adresse", type="string", length=255)
         */
        private $adresse;
     
        /**
         * @ORM\ManyToMany(targetEntity="Proprietaire", mappedBy="autres")
         */
        private $proprietaires;
     
     
        /**
         * Get id
         *
         * @return integer 
         */
        public function getId()
        {
            return $this->id;
        }
     
        /**
         * Set adresse
         *
         * @param string $adresse
         */
        public function setAdresse($adresse)
        {
            $this->adresse = $adresse;
        }
     
        /**
         * Get adresse
         *
         * @return string 
         */
        public function getAdresse()
        {
            return $this->adresse;
        }
        public function __construct()
        {
            $this->proprietaires = new \Doctrine\Common\Collections\ArrayCollection();
        }
     
        /**
         * Add proprietaires
         *
         * @param Essai\ManyBundle\Entity\Propietaire $proprietaires
         */
        public function addPropietaire(\Essai\ManyBundle\Entity\Propietaire $proprietaires)
        {
            $this->proprietaires[] = $proprietaires;
        }
     
        /**
         * Get proprietaires
         *
         * @return Doctrine\Common\Collections\Collection 
         */
        public function getProprietaires()
        {
            return $this->proprietaires;
        }
     
        /**
         * Add proprietaires
         *
         * @param Essai\ManyBundle\Entity\Proprietaire $proprietaires
         */
        public function addProprietaire(\Essai\ManyBundle\Entity\Proprietaire $proprietaires)
        {
            $this->proprietaires[] = $proprietaires;
        }
    }
    Dans MySql les tables crées sont

    -autre
    -proprietaire
    proprietaire_autres

    Donc je repète ma question.
    Comment faire pour afficher les résultats dans une page. EX:

    nom prenom adresse

    Merci beaucoup

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    $dql='SELECT p,a FROM Essai\ManyBundle\Entity\Proprietaire p LEFT JOIN p.autres a'
    $list=$em->createQuery($dql)->getResult();
    foreach($list as $proprio):
     echo '<br/>',$proprio->getNom(),$proprio->getPrenom():
     foreach($proprio->getAutres() as $autre):
      echo ' - ',$autre->getAdresse();
     endforeach;
    endforeach;

  3. #3
    Membre confirmé
    Inscrit en
    Août 2002
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 94
    Par défaut Salut et merci.
    Voici ce que j'ai fait dans un fichier repository(symfony2)

    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
    class ProprietaireRepository extends EntityRepository
    {
        public function getAvecAutres()
        {
            return  $this->getEntityManager()
            ->createQuery('
                SELECT p,a FROM EssaiManyBundle:Proprietaire p
                LEFT JOIN p.autres a'
     
            )
            ->getResult();
     
     
     
        }    
     
     
    }
    Maintenant dans mon controller

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     public function indexAction()
        {
            $em = $this->getDoctrine()->getEntityManager();
     
            $entities = $em->getRepository('EssaiManyBundle:Proprietaire')->getAvecAutres();
     
            return array('entities' => $entities);
        }
    et enfin dans ma page index.html.twig
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    {% for entity in entities   %}
    {{entity.nom}} {{entity.prenom}}  {{entity.a.adresse}}
    {% endfor %}
    Rien a faire je suis capable si j'enlève {{entity.a.adresse}} de voir mes données de la table propriétaire mais incapable de voir l'adresse associer de la table Autre

    Merci d'avance pour l'aide.

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    {% for entity in entities   %}
    {{entity.nom}} {{entity.prenom}}  {{entity.a.adresse}}
    //entity represente une instance de la classe propriétaire , cette classe n'a pas d'attribut "a", c'est juste l'alias utilisé dans la requete DQL
    //et si tu écris "entity.autres" tu fais appel à une collection d'objets"Autre" donc tu ne peut que boucler dessus 
    {% endfor %}
    Le problème c'est ton mapping:
    Si un propriétaire a une adresse et qu'une adresse a un seul propriétaire c'est une relation OneToOne entre adresse et propriétaire.

    Nommer une entité "Autre" n'est pas une bonne chose parce que "Autre" ne signifie rien dans ta logique métier.

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

Discussions similaires

  1. Relation 0-n; requête pour afficher les relations 0
    Par PhilLU dans le forum Débuter
    Réponses: 2
    Dernier message: 13/07/2014, 23h03
  2. [phpMyAdmin] afficher les relations dans le Concepteur phpMyAdmin
    Par kyokotsu dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 14/12/2012, 10h10
  3. Controle data: afficher les relations d'une table
    Par jacko842 dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 29/11/2007, 18h22
  4. Réponses: 3
    Dernier message: 10/08/2006, 18h43
  5. [Relations] afficher les relations entre 2 tables
    Par dzincou dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 14/01/2004, 18h07

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