Symfony 2 – Relation @ManyToMany complexe
Transcription
Symfony 2 – Relation @ManyToMany complexe
O.R.M. Doctrine Les relations 100 Symfony 2 – Entités – Les relations Symfony y y_03 La représentation des relations vient du monde Java (JPA : Java Persistance Api), est peut être spécifiée via des annotations Elle représentent les cardinalités entre chaque entités Elles relations peuvent être de formes diverses : un à plusieurs : un à plusieurs : @OneToMany @OneToMany plusieurs à un : @ManyToOne plusieurs à plusieurs : @ManyToMany ... 101 Symfony 2 – Relation @OneToMany et @ManyToOne Symfony y y_03 La relation @OntetoMany, permet de définir une relation de type 1 à plusieurs Elle doit être associée à une relation @ManyToOne si l'on veut avoir une association ll d i ê ié à l i @ i l' i i i bidirectionnelle P l Par exemple : les villageois et leur spécialité Plusieurs villageois peuvent avoir la même spécialité Relation@ManyToOne dans ll'entité entité Villageois Villageois 102 Une spécialité peut concerner plusieurs villageois Relation @OneToMany Relation @OneToMany dans dans l'entité Specialite Symfony 2 – Relation @OneToMany et @ManyToOne Symfony y y_03 Entité Specialite.php : Cible de la relation Rôle correspondant dans l'entité cible ... /** * @ORM\OneToMany(targetEntity="Villageois", mappedBy="laSpecialite") */ / private $lesVillageois; Rôle de l'association ... laSpecialite lesVillageois 103 Symfony 2 – Relation @OneToMany et @ManyToOne Symfony y y_03 Entité Villageois.php : Cible de la relation Rôle de l'association dans l'entité cible (relation inverse : OneToMany) ... /** * @ORM\ManyToOne(targetEntity="Specialite", inversedBy="lesVillageois") * @ORM\JoinColumn(name= @ORM\JoinColumn(name="ID ID_SPECIALITE SPECIALITE", referencedColumnName= referencedColumnName="ID ID_SPECIALITE SPECIALITE") ) */ private $laSpecialite; ... Rôl d l' Rôle de l'association i ti Colonnes concernées par la jointure de la Base de données laSpecialite lesVillageois 104 Relation @OneToMany et @ManyToOne ‐ Exercice Ecrire la relation bi directionnelle suivante : typeCasque lesCasques 105 Relation @OneToMany et @ManyToOne ‐ Exercice typeCasque lesCasques Dans la classe Casque php : Dans la classe Casque.php : /** * @ORM\M @ORM\ManyToOne(targetEntity="TypeCasque", T O (t tE tit "T C " inversedBy="lesCasques") i dB "l C ") * @ORM\JoinColumn(name="ID_TYPE_CASQUE", referencedColumnName="ID_TYPE_CASQUE") */ private $typeCasque; D l l T C h Dans la classe TypeCasque.php : /** * @O @ORM\OneToMany(targetEntity="Casque", mappedBy="typeCasque") \O ( i C d C ) */ private $lesCasques; 106 Symfony 2 – Relation @ManyToMany Symfony y y_03 Permet de définir une relation de type plusieurs à plusieurs Cas d'une Cas d une table de jointure table de jointure Plusieurs cas peuvent se présenter : La table de jointure ne concerne que 2 tables, elle ne possède pas d La table de jointure ne concerne que 2 tables elle ne possède pas d'informations informations autre que le report des clefs étrangères Relation ManytoMany simple La table de jointure ne concerne que 2 tables, elle possède des informations supplémentaires autres que le report des clefs étrangères Relation ManyToMany complexe y y p La table de jointure concerne plus de 2 tables, elle possède des informations supplémentaires autres que le report des clefs étrangères Relation ManyToMany ternaire complexe 107 Symfony 2 – Relation @ManyToMany simple Symfony y y_03 Exemple : Une vidéo peut posséder plusieurs types, et pour un type donné, on peut avoir plusieurs vidéos Dans ce cas la table type_video n'a pas d'entité, on la cite simplement comme table de jointure 108 Symfony 2 – Relation @ManyToMany simple Symfony y y_03 Annotations dans l'entité : Video.php : Cible de la relation Nom du rôle de la classe actuelle dans la classe cible ... /** * @ORM\ManyToMany(targetEntity="Type", inversedBy="lesVideos") * @ORM\JoinTable(name="type_video", Nom de la table de jointure * joinColumns={ * @ORM\JoinColumn(name="ID @ORM\JoinColumn(name= ID_VIDEO VIDEO", referencedColumnName= referencedColumnName="ID ID_VIDEO VIDEO") ) * }, * inverseJoinColumns={ * @ORM\JoinColumn(name="ID_TYPE", referencedColumnName="ID_TYPE") * }) */ private $lesTypes; Rôle des types pour une vidéo ... JoinColumn : Description de la jointure de la table video vers la table type_video 109 InverseJoincolumns : Description de la relation inverse, soit de type vers type_video Symfony 2 – Relation @ManyToMany simple Symfony y y_03 Annotation dans l'entité : Type.php : Cible de la relation Nom du rôle de la classe actuelle dans la classe cible classe cible /** * @ORM\ManyToMany(targetEntity="Video", mappedBy="lesTypes") */ private $lesVideos; On dit dans ce cas que la classe Video est propriétaire de la relation ManyToMany, la l T é i l l ti i ' ll it bidi ti ll classe Type ne précise que la relation inverse, pour qu'elle soit bidirectionnelle 110 Symfony 2 – Relation @ManyToMany simple ‐ Exercice Ecrire la relation bi directionnelle suivante : lesVideos La classe Video est propriétaire de la relation ManyToMany 111 lesActeurs Symfony 2 – Relation @ManyToMany simple ‐ Exercice lesVideos lesActeurs Dans la classe Video.php (propriétaire le la relation): /** * @O @ORM\ManyToMany(targetEntity="Participant", \ ( i " i i " inversedBy="lesVideos") i d "l id ") * @ORM\JoinTable(name="distribution", * joinColumns={ * @ORM\JoinColumn(name="ID_VIDEO", referencedColumnName="ID_VIDEO") * } }, * inverseJoinColumns={ * @ORM\JoinColumn(name="ID_PARTICIPANT",referencedColumnName="ID_PARTICIPANT") * }) */ private $lesActeurs; Dans la classe Participant.php : p p p /** * @ORM\ManyToMany(targetEntity="Video", mappedBy="lesActeurs") / */ private $lesVideos; 112 Symfony 2 – Relation @ManyToMany complexe Symfony y y_03 La relation @ManytoMany complexe, permet de définir une relation de type plusieurs à plusieurs, lorsque la table de jointure contient des informations complémentaires autres que des clefs étrangères d l f é è Par exemple : U ti t é d l i i édi t Une potion est composée de plusieurs ingrédients Un ingrédient peut intervenir dans plusieurs potions La table compose indique une quantité (info complémentaire) 113 Symfony 2 – Relation @ManyToMany complexe Symfony y y_03 On décompose ce cas sous la forme suivante : On créé une entité Compose : 2 relations ManyToOne partant de Compose : Une pour potion L'autre pour Ingredient Une relation OneToMany allant de Potion vers Compose Potion vers Compose 114 Une relation OneToMany allant de Ingredient vers Compose Symfony 2 – Relation @ManyToMany complexe Symfony y y_03 Entité Compose.php : <?php p p namespace Mmi\lesGauloisBundle\Entity; use Doctrine\ORM\Mapping as ORM; /** * Compose p * @ORM\Table(name="compose") * @ORM\Entity(repositoryClass="Mmi\lesGauloisBundle\Entity\ComposeRepository") */ class Compose { /** Description de la relation avec Potion * @ORM\Id * @ORM\ManyToOne(targetEntity="Potion") * @ORM\JoinColumn(name="ID_POTION", referencedColumnName="ID_POTION") */ private $potion; ... 115 Symfony 2 – Relation @ManyToMany complexe Symfony y y_03 Entité Compose.php : ... Description de la relation avec Ingredient /** * @ORM\Id * @ORM\ManyToOne(targetEntity="Ingredient") * @ORM\JoinColumn(name="ID_INGREDIENT", referencedColumnName="ID_INGREDIENT") */ private $ingredient; /** D Description de la colonne COUT / attribut $cout i ti d l l COUT / tt ib t $ t * @var qte * * @ORM\Column(name="QTE", type="integer") */ private $qte; ... 116 Symfony 2 – Relation @ManyToMany complexe Symfony y y_03 Entité Compose.php : ... public function Compose(){ } Constructeur, getters et setters p public function g getPotion(){return $this->potion;} p public function getIngredient(){return $this->ingredient;} public function getQte(){return $this->qte;} public function setPotion($potion){$this->potion = $potion;} public function setIngredient($ingredient){$this->ingredient = $ingredient;} public function setQte($qte){$this->qte = $qte;} } 117 Symfony 2 – Relation @ManyToMany complexe Symfony y y_03 Entité Potion.php : (annotations pour Compose) Rôle de Potion dans la classe Compose ... /** * @ORM\OneToMany(targetEntity="compose", mappedBy="potion") */ private $lesIngredients; Rôle ... public function getLesIngredients(){return $this->lesIngredients;} ... public function setLesIngredients($lesIngredients){$this->lesIngredients = $lesIngredients;} ... Les getters et setters g 118 Symfony 2 – Relation @ManyToMany complexe Symfony y y_03 Entité Ingredient.php : (annotations pour Compose) Rôle de Ingredient dans la classe Compose ... /** * @ORM\OneToMany(targetEntity="compose", mappedBy="ingredient") */ private $lesPotions; Rôle ... ... public function getLesPotions(){return $this->lesPotions;} ... public function setLesPotions($lesPotions){$this->lesPotions = $lesPotions;} ... Les getters et setters g 119 Symfony 2 – Relation @ManyToMany complexe ‐ Exercice Ecrire les relation multi directionnelle suivante : lesPotionsBues villageois 120 potion lesConsommations Symfony 2 – Relation @ManyToMany complexe ‐ Exercice lesPotionsBues villageois g potion p l C lesConsommations ti Dans la classe Boit.php : /** * @ORM\Id * @ORM\ManyToOne(targetEntity="Potion") * @ORM\JoinColumn(name="ID_POTION", referencedColumnName="ID_POTION") */ private $potion; /** * @ORM\Id * @ORM\ManyToOne(targetEntity="Villageois") * @ORM\JoinColumn(name="ID_VILLAGEOIS", referencedColumnName="ID_VILLAGEOIS") */ private $villageois; 121 Symfony 2 – Relation @ManyToMany complexe ‐ Exercice lesPotionsBues villageois g potion p Dans la classe Potion.php : /** * @ORM\OneToMany(targetEntity="Boit", \ mappedBy="potion") */ private $lesConsommations; Dans la classe Villageois.php : /** * @ORM\OneToMany(targetEntity="Boit", mappedBy="villageois") \ */ private $lesPotionsBues; 122 l C lesConsommations ti Symfony 2 – Relation @ManyToMany ternaire, complexe Symfony y y_03 La relation @ManytoMany ternaire, permet de définir une relation de type plusieurs à plusieurs, et ce sur plus de 2 tables, donc plus de 2 entités La table de jointure peut contenir des informations complémentaires autres que des bl d j i i d i f i lé i d clefs étrangères Par exemple : L ill i ti i t à d b t ill t d ll il è td Les villageois participent à des batailles , au terme desquelles ils ramènent des casques 123 Symfony 2 – Relation @ManyToMany ternaire, complexe Symfony y y_03 On décompose ce cas sous la forme suivante : On créé une entité PriseCasque (pour la table prise_casque) : @OneToMany @ManyToOne @OneToMany @ManyToOne @ManyToOne @OneToManyy @ 124 On a autant de relation @OneToMany, de On a autant de relation @OneToMany de priseCasque que de tables liées, vers les autres entités Chaque autre entité contient une relation Chaque autre entité contient une relation @ManyToOne vers PriseCasque Symfony 2 – Relation @ManyToMany ternaire, complexe Symfony y y_03 Entité PriseCasque.php : <?php namespace Mmi\lesGauloisBundle\Entity; use Doctrine\ORM\Mapping as ORM; /** * PriseCasque * * @ORM\Table(name="prise_casque") * @ORM\Entity(repositoryClass= @ORM\Entity(repositoryClass="Mmi\lesGauloisBundle\Entity\PriseCasqueRepository") Mmi\lesGauloisBundle\Entity\PriseCasqueRepository ) */ class PriseCasque { Description de la relation avec Bataille p /** / * @ORM\Id * @ORM\ManyToOne(targetEntity="Bataille") * @ORM\JoinColumn(name="ID_BATAILLE", referencedColumnName="ID_BATAILLE") */ / private $bataille; ... 125 Symfony 2 – Relation @ManyToMany ternaire, complexe Symfony y y_03 Entité PriseCasque.php : ... Description de la relation avec Villageois /** * @ORM\Id * @ORM\ManyToOne(targetEntity="Villageois") * @ORM\JoinColumn(name="ID @ORM\JoinColumn(name= ID_VILLAGEOIS VILLAGEOIS", referencedColumnName= referencedColumnName="ID ID_VILLAGEOIS VILLAGEOIS") ) */ private $villageois; /** Description de la relation avec Casque p q * @ORM\Id * @ORM\ManyToOne(targetEntity="Casque") * @ORM\JoinColumn(name="ID_CASQUE", referencedColumnName="ID_CASQUE") */ private $casque; Description de la colonne QTE, attribut $qte /** * @var Qte * @ORM\Column(name="QTE", type="integer") */ / private $qte; .. 126 Symfony 2 – Relation @ManyToMany ternaire, complexe Symfony y y_03 Entité PriseCasque.php : ... public function PriseCasque(){ } } 127 Constructeur, getters et setters public public public public function function function function getBataille(){return $this $this->bataille;} >bataille;} getVillageois(){return $this->villageois;} getCasque(){return $this->casque;} getQte(){return $this->qte;} public public public public function function function function setBataille($bataille){$this->bataille = $bataille;} setVillageois($villageois){$this->villageois = $villageois;} setCasque($casque){$this->casque = $casque;} setQte($qte){$this->qte setQte($qte){$this >qte = $qte;} Symfony 2 – Relation @ManyToMany ternaire, complexe Symfony y y_03 Entité Bataille.php : (annotations pour PriseCasque) Rôle de Bataille dans la classe PriseCasque ... /** * @ORM\OneToMany(targetEntity="PriseCasque", mappedBy="bataille") */ private $priseCasque; Rôle ... ... public function getPriseCasque(){return $this->priseCasque;} ... public function setPriseCasque($priseCasque){$this->priseCasque=$priseCasque;} ... Les getters et setters g 128 Symfony 2 – Relation @ManyToMany ternaire, complexe Symfony y y_03 Entité Villageois.php : (annotations pour PriseCasque) Rôle de Villageois dans la classe PriseCasque ... /** @ORM\OneToMany(targetEntity="PriseCasque", mappedBy="villageois") */ private $priseCasque; Rôle ... ... public function getPriseCasque(){return $this->priseCasque;} ... public function setPriseCasque($priseCasque){$this->priseCasque=$priseCasque;} ... Les getters et setters g 129 Symfony 2 – Relation @ManyToMany ternaire, complexe Symfony y y_03 Entité Casque.php : (annotations pour PriseCasque) Rôle de Casque dans la classe PriseCasque ... /** @ORM\OneToMany(targetEntity="PriseCasque", mappedBy="casque") */ private $priseCasque; Rôle ... ... public function getPriseCasque(){return $this->priseCasque;} ... public function setPriseCasque($priseCasque){$this->priseCasque=$priseCasque;} ... Les getters et setters g 130 Relation @ManyToMany ternaire, complexe ‐ Exercice Ecrire les relation multi directionnelle suivante : video id client loue loue loue format 131 Relation @ManyToMany ternaire, complexe ‐ Exercice Dans la classe Loue.php : /** * @ORM\Id * @ORM\ManyToOne(targetEntity="Client") * @ORM\JoinColumn(name @ORM\JoinColumn(name="ID ID_CLIENT CLIENT",referencedColumnName="ID ,referencedColumnName ID_CLIENT CLIENT") ) */ private $client; /** * @ORM\Id @O \ d * @ORM\ManyToOne(targetEntity="Video") * @ORM\JoinColumn(name="ID_VIDEO", referencedColumnName="ID_VIDEO") */ private $ p $video; ; /** * @ORM\Id * @ORM\ManyToOne(targetEntity="Format") * @ @ORM\JoinColumn(name="ID \ ( _FORMAT", , referencedColumnName="ID_FORMAT") ) */ private $format; 132 Relation @ManyToMany ternaire, complexe ‐ Exercice Dans la classe Client php : Dans la classe Client.php : /** * @ORM\OneToMany(targetEntity="Loue", mappedBy="client") */ private $loue; Dans la classe Format php : Dans la classe Format.php : /** * @ORM\OneToMany(targetEntity="Loue", mappedBy="format") */ private $loue; p p Dans la classe Video.php : /** * @ORM\OneToMany(targetEntity="Loue", mappedBy="video") / */ private $loue; 133 Diagramme de classes Symfony 2 : lesGaulois 134