L’ORM
(Object-Relational Mapping) :
Doctrine
UP Web
AU: 2020/2021
Plan
1. Introduction
2. Doctrine2
3. Les entités
4. La Migration
5. Entity Manager: Manipuler les entités avec Doctrine2
6. Les relations entres entités avec Doctrine2
2
Introduction
❑ La programmation Orientée Objet, utilisant une base de
données relationnelle, nécessite de convertir les
données relationnelles en objets et vice-versa.
❑ Persistance d’objets métiers : les objets modélisés dans
les applications sont associées à des données stockées
dans les SGBDR
3
Object-Relational Mapping (ORM)
❑ C’est une couche d’abstraction à la base de donnée.
❑ ORM fait la relation entre les données orientées objet et
les données relationnelles.
4
Object-Relational Mapping
❑ Les ORM les plus connus:
En Java: - Hibernate
- JPA (Java Persistance API)
- SimpleORM
En .NET: - Nhibernate
- Entity Framework
Quel choix pour PHP:
- Doctrine
- Propel
- RedBean
5
Object-Relational Mapping
Avantages:
❑ Simplifie l’accès aux données
❑ Facilite le changement de SGBDR
❑ Permet une indépendance du code vis-à-vis du SGBDR utilisé
6
Doctrine
❑ C’est un ORM pour PHP
❑ Logiciel open source
❑ Dernière version stable: 2.7.3
❑ Intégré dans différents Frameworks:
■ Symfony,
■ Zend Framework
■ CodeIgniter
7
Doctrine - Caractéristiques
Une classe qui correspond à chaque table
Une classe = une « Entité »
8
Doctrine – Architecture Technique
9
Architecture Technique de Doctrine
Doctrine - Caractéristiques
On a deux méthodes pour le Mapping:
● Fichier de mapping YAML, XML.
● Directement dans la classe via des annotations
10
Configuration de la base de
données
Configurer la base de données de l’application
dans le fichier .env
11
Création de la base de données
La commande suivante permet de créer une base de données :
php bin/console doctrine:database:create
=>Une base de données avec les propriétés mentionnées dans
.env sera automatiquement générée
12
Les entités
Il existe deux méthodes pour générer les entités :
1. Méthode manuelle (non recommandée)
❑ Créer la classe
❑ Ajouter le mapping
❑ Ajouter les getters et les setters (manuellement ou en utilisant la
commande suivante :
➔ php bin/console make:entity --regenerate App
13
Les entités
2. Méthode en utilisant les commandes
Ajouter une entité en lançant la commande suivante :
➔ php bin/console make:entity
Ajouter les attributs et les paramètres
14
Les entités
Configuration de l’entité:
● @ORM\Id(): spécifie la clé primaire
● @ORM\GeneratedValue(): auto-incrémentée l’ID
● @ORM\Column: s'applique sur un attribut
de la classe et permet de définir les caractéristiques
de la colonne concernée (nom , taille , types, etc.)
15
La Migration
La migration permet de gérer les mises à jours et les évolutions de votre base de
données.
Une image = Une évolution de la base de donnée
La commande ci-dessous nous permet de créer un fichier de migration:
➔ php bin/console make:migration
La commande ci-dessous nous permet de lancer une migration:
➔ php bin/console doctrine:migrations:migrate
La version d’une migration sous forme de «YYYYMMDDHHMMSS »
Le nom de la classe est un timestamp(La valeur représentant la date et l'heure est
appelée timestamp) qui sera stocké dans la base dans une table doctrine_migrations.
16
La Migration
La classe générée possède deux méthodes:
⮚ La méthode up permet, lors de l’exécution de la
commande migrations:migrate d’exécuter les requêtes de migrations vers un
nouveau état
⮚ La méthode down permet de revenir à l’état précédent.
17
La Migration
doctrine:migrations:current Afficher la version actuelle
doctrine:migrations:execute version Exécuter une seule version de migration
doctrine:migrations:generate Créer un fichier de migration vide
doctrine:migrations:latest Afficher la dernière version migration
doctrine:migrations:migrate Exécuter plusieurs version de migrations non
exécutées
doctrine:migrations:status Afficher l'état d'un ensemble de migrations
doctrine:migrations:up-to-date Nous indiquer si le schéma est à jour
doctrine:migrations:version version -- add/delete Ajouter ou supprimer manuellement les versions
de migration de la table des versions.
doctrine:migrations:sync-metadata-storage Garantit que le stockage des métadonnées est à la
dernière version.
doctrine:migrations:list Afficher la liste de toutes les migrations disponibles
et leur état
(*) version: namespace\version
Exemple: DoctrineMigrations\Version20201013084414
18
Entity Manager
❑ EM est un gestionnaire d’entités: le chef d’orchestre de l’ORM
Doctrine
❑ EM est placée entre les objets (entités) et les tables de la base
de données.
❑ EM permet l’insertion, la mise à jour et la suppression des
données de la base de données
19
Manipulation des entités avec
Doctrine2
Tout d’abord, On doit récupérer l’entity manager
➔ $em= $this->getDoctrine()->getManager()
• La méthode persist() signale à Doctrine que l’objet doit être
enregistré. Elle est utilisée que pour un nouvel objet et non pas pour
une mise à jour :
➔ $em->persist($object)
• La méthode flush() permet d'envoyer tout ce qui a été persisté avant
à la base de données, càd mettre à jour la base à partir des objets
signalés à Doctrine
➔ $em->flush()
20
Manipulation les entités avec
Doctrine2
• La méthode remove() indique à Doctrine de supprimer l'entité en
argument de la base de données
➔ $em->remove($object)
• La méthode clear() permet d’annuler tous les persist
➔ $em->clear()
• La méthode detach() permet d’annuler le persist effectué sur
l’entité en argument
➔ $em->detach($object)
21
Création d’un Formulaire
Un formulaire Symfony est l’image d’un objet existant
Insertion: Un formulaire sert à alimenter un objet.
Mise à jour: Un formulaire sert à récupérer des informations
indépendantes de n’importe quel objet.
Pour installer les dépendances du formulaire, il faut exécuter
cette commande: composer require symfony/form
22
Création d’un Formulaire
Principe
On peut définir un formulaire soit:
1. dans le contrôleur
2. dans un autre objet qui sera appelé par le contrôleur
23
Création d’un Formulaire
Méthode 1: Création d’un formulaire dans le controlleur(½)
Pour indiquer les champs à ajouter au formulaire on utilise la méthode
add du FromBuilder
Cette méthode contient 3 paramètres :
1) le nom du champ dans le formulaire
2) le type du champ
3) un array qui contient des options spécifiques au type du champ
24
Création d’un Formulaire
Méthode 1: Création d’un formulaire dans le controlleur(2/2)
Récupération du formulaire dans le contrôleur
La récupération du formulaire au niveau des contrôleurs devient
beaucoup plus facile :
Le second paramètre « $nomClass» n’est pas obligatoire
25
Création d’un Formulaire
Problématique:
Comment alléger le contrôleur ?
Solution:
Générer une classe qui s’occupe de la construction d’un formulaire
Comment?
utilisation de la commande:
php bin/console make:form FormName
26
Création d’un Formulaire
Méthode 2: Utilisation de la commande
La commande suivante nous permet de créer un Formulaire :
php bin/console make:form FormName
Maker vous demandera si votre formulaire est associé à une entité
ou non. Répondez selon votre besoin.
Un objet dont le nom est « FormNameType » sera automatiquement
créé dans le dossier src/Form et qui contient une fonction buildForm
27
Création d’un Formulaire
L’envoi du formulaire à la page twig
➔ return $this->render('formation/.[Link]', ['form' => $form->createView()]);
Affichage du formulaire dans TWIG
⮚ Afficher la totalité du formulaire avec la méthode form
{{ form(nomDuFormulaire) }}
⮚ Afficher les composants du formulaire séparément un à un
{{ form_start(form) }}
{{ form_row([Link]) }}
{{ form_errors(form) }}
{{ form_label([Link]) }}
{{ form_widget([Link]) }}
{{ form_end(form) }}
28
Les relations entre les entités
Les types de relation possibles
Une relation (ou une association) peut être:
➢ Unidirectionnelle : Seules les instances de l’une des entités de l’association
peuvent retrouver les instances de l’entité partenaire.
⇒ Par exemple : un utilisateur peut obtenir la liste de ses adresses
connues, par contre il n’est pas possible de retrouver un utilisateur à partir
d’une adresse.
➢ Bidirectionnelle: Les instances de l’une ou de l’autre des entités de
l’association peuvent retrouver les instances de l’entité partenaire.
⇒ Par exemple : un utilisateur peut obtenir la liste des commandes qu’il a
effectué et on peut retrouver un utilisateur à partir d’une commande.
29
Les relations entre les entités
Many To One ,unidirectionnel
Exemple : un foyer universitaire héberge plusieurs étudiants
❏ @JoinColumn : indique le nom de la propriété
dans la table ainsi que le nom de la propriété
dans la table partenaire de l’association.
30
Les relations entre les entités
One To One ,unidirectionnel
Exemple : un seul étudiant possède une seule adresse
⇒ targetEntity : L’entité en relation
avec l’entité en question
⇒ mappedBy : indique la propriété
dans la classe partenaire qui est
propriétaire de l’association.
31
Les relations entre les entités
One To Many ,unidirectionnel
Exemple : un étudiant admet plusieurs num de téléphone.
❏ Pour récupérer les données d’une table. La variable
$phonenumbers est de type
Doctrine\Common\Collections\ArrayCollection
32
Les relations entre les entités
Many To Many ,unidirectionnel
Exemple : plusieurs étudiants réalisent plusieurs projets.
33
Les relations entre les entités
Remarques:
❏ Les relations, qu’on a étudiées, sont unidirectionnelles
❏ C’est à dire on peut faire $student->getProjects()
❏ Mais on ne peut pas faire $project->getStudent()
Solution:
❏ Rendre les relations bidirectionnelles
34
Les relations entre les entités
One To One ,bidirectionnel
Exemple : un étudiant possède son propre carte d’étudiant.
⇒ mappedBy fait référence à
l’attribut student dans la
classe Studentcart
⇒ inversedBy fait référence à
l’attribut cart dans la classe
Adresse 35
Les relations entre les entités
One To Many ,bidirectionnel
Exemple : Une classe contient plusieurs étudiants.
❏ targetEntity : namespace complet vers
l’entité liée.
❏ mappedBy : il s’agit de l’attribut de l’entité
cible qui illustre la relation entre les deux
entités
NB : Obligatoirement dans l’entité target il
faut avoir une définition d’attribut avec le
mot clé ManyToOne
36
Les relations entre les entités
Many To Many ,bidirectionnelle avec table de jointure
❏On peut générer la relation entre les deux entités
automatiquement:
Prenons l’exemple d’une relation ManyToMany
⇒ Plusieurs étudiants peuvent appartenir à plusieurs clubs.
❏ On doit tout d’abord modifier notre entité “Student” en tapant
la commande suivante:
37
Les relations entre les entités
Many To Many ,bidirectionnelle avec table de jointure
❏ Maintenant il faut ajouter l’attribut, dans notre cas “clubs”:
❏ Spécifier le nom de la classe avec laquelle est reliée qui “Club”:
❏ Spécifier le type de cet attribut, tapez “relation” :
38
Les relations entre les entités
Many To Many ,bidirectionnelle avec table de jointure
❏ Par la suite , veuillez indiquer le type de relation : ManyToMany
39
Les relations entre les entités
Many To Many ,bidirectionnelle avec table de jointure
[Link]
[Link]
40
Atelier 4
41
Références
• [Link]
[Link]/manual/fr/[Link]
• [Link]
42