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

Documents pareils