Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen...

145
Symfony 5 : Doctrine Achref El Mouelhi Docteur de l’universit ´ e d’Aix-Marseille Chercheur en Programmation par contrainte (IA) Ing ´ enieur en G ´ enie logiciel [email protected] H & H: Research and Training 1 / 105

Transcript of Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen...

Page 1: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

Symfony 5 : Doctrine

Achref El Mouelhi

Docteur de l’universite d’Aix-MarseilleChercheur en Programmation par contrainte (IA)

Ingenieur en Genie logiciel

[email protected]

H & H: Research and Training 1 / 105

Page 2: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

Plan

1 Introduction

2 Creation et configuration d’une base de donnees

3 EntityCreation d’une entiteCreation de tables associees a des entitesModification entites/tables

4 EntityManager et RepositoryInsertionConsultationModificationSuppressionAutres methodes d’EntityManager

H & H: Research and Training 2 / 105

Page 3: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

Plan

5 RepositoryQuery BuilderDQLSQL

6 Relation entre entitesOneToOneManyToOneManyToManyAssociation porteuse de donneesRelation bidirectionnelleInheritance

7 Evenement et methodes callback

8 Generation d’entites a partir d’une base de donnees existante

H & H: Research and Training 3 / 105

Page 4: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Introduction

Symfony

Object-Relational Mapping (lien objet-relation)

est une couche d’abstraction a la base de donnees

est une classe qui permet a l’utilisateur d’utiliser les tables d’unebase de donnees comme des objets

consiste a associer :

une ou plusieurs classes a chaque table

un attribut de classe a chaque colonne de la table

Plusieurs ORM proposes pour chaque Langage de POO.

H & H: Research and Training 4 / 105

Page 5: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Introduction

Symfony

Object-Relational Mapping (lien objet-relation)

est une couche d’abstraction a la base de donnees

est une classe qui permet a l’utilisateur d’utiliser les tables d’unebase de donnees comme des objets

consiste a associer :

une ou plusieurs classes a chaque table

un attribut de classe a chaque colonne de la table

Plusieurs ORM proposes pour chaque Langage de POO.

H & H: Research and Training 4 / 105

Page 6: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Introduction

Symfony

Quel choix pour PHP?

Doctrine

pdoMap

RedBean

FoxORM

...

H & H: Research and Training 5 / 105

Page 7: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Introduction

Symfony

Doctrine?

un ORM pour PHP

propose en 2006 par Konsta Vesterinen (2.0 fin 2010)

utilise par Symfony depuis la version 1.3 (et autres comme Zend Framework,Codelgniter...)

inspire par Hibernate : ORM Java

Doctrine est compose de (deux) couches

Doctrine (ORM) qui se base sur Doctrine (DBAL)

Doctrine (DBAL) (DataBase Abstraction Layer ou couche d’abstraction de basede donnees) qui se base aussi sur PDO (PHP Data Objets) pour l’abstractiond’acces aux donnees

H & H: Research and Training 6 / 105

Page 8: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Introduction

Symfony

Doctrine?

un ORM pour PHP

propose en 2006 par Konsta Vesterinen (2.0 fin 2010)

utilise par Symfony depuis la version 1.3 (et autres comme Zend Framework,Codelgniter...)

inspire par Hibernate : ORM Java

Doctrine est compose de (deux) couches

Doctrine (ORM) qui se base sur Doctrine (DBAL)

Doctrine (DBAL) (DataBase Abstraction Layer ou couche d’abstraction de basede donnees) qui se base aussi sur PDO (PHP Data Objets) pour l’abstractiond’acces aux donnees

H & H: Research and Training 6 / 105

Page 9: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Introduction

Symfony

Doctrine (DBAL)

ajoute des fonctionnalites a PDO

permet de manipuler les bases de donnees avec des fonctionspredefinies (pas d’utilisation du concept objet)

Doctrine (ORM)

definit le lien entre DBAL et le monde objet

permet de manipuler les elements d’une base de donnees commedes objets

H & H: Research and Training 7 / 105

Page 10: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Introduction

Symfony

Doctrine (DBAL)

ajoute des fonctionnalites a PDO

permet de manipuler les bases de donnees avec des fonctionspredefinies (pas d’utilisation du concept objet)

Doctrine (ORM)

definit le lien entre DBAL et le monde objet

permet de manipuler les elements d’une base de donnees commedes objets

H & H: Research and Training 7 / 105

Page 11: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Introduction

Symfony

Telechargement (pas besoin avec Symfony)

Aller danshttp://www.doctrine-project.org/projects/orm.html

Telecharger la derniere version stable

H & H: Research and Training 8 / 105

Page 12: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Introduction

Symfony

Objectif

Ne plus ecrire des requetes SQL

Si on ne choisit pas la version complete a la creation du projet

composer require symfony/orm-pack

composer require --dev symfony/maker-bundle

H & H: Research and Training 9 / 105

Page 13: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Introduction

Symfony

Objectif

Ne plus ecrire des requetes SQL

Si on ne choisit pas la version complete a la creation du projet

composer require symfony/orm-pack

composer require --dev symfony/maker-bundle

H & H: Research and Training 9 / 105

Page 14: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Creation et configuration d’une base de donnees

SymfonyPreparation de la chaıne de connexion

Allez dans le fichier .env

Cherchez la ligne DATABASE URL=mysql://db user:db [email protected]:3306/db name?serverVersion=5.7

Remplacez la par DATABASE URL="mysql://root:[email protected]:3306/courssymfony?serverVersion=8.0.21" puis enregistrez

Pour creer la base de donnees (N’oubliez pas de demarrer MAMP ou WAMP)

Executer la commande php bin/console doctrine:database:createou php bin/console d:d:c

Resultat

Created database ‘courssymfony‘ for connection named default

H & H: Research and Training 10 / 105

Page 15: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Creation et configuration d’une base de donnees

SymfonyPreparation de la chaıne de connexion

Allez dans le fichier .env

Cherchez la ligne DATABASE URL=mysql://db user:db [email protected]:3306/db name?serverVersion=5.7

Remplacez la par DATABASE URL="mysql://root:[email protected]:3306/courssymfony?serverVersion=8.0.21" puis enregistrez

Pour creer la base de donnees (N’oubliez pas de demarrer MAMP ou WAMP)

Executer la commande php bin/console doctrine:database:createou php bin/console d:d:c

Resultat

Created database ‘courssymfony‘ for connection named default

H & H: Research and Training 10 / 105

Page 16: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Creation et configuration d’une base de donnees

SymfonyPreparation de la chaıne de connexion

Allez dans le fichier .env

Cherchez la ligne DATABASE URL=mysql://db user:db [email protected]:3306/db name?serverVersion=5.7

Remplacez la par DATABASE URL="mysql://root:[email protected]:3306/courssymfony?serverVersion=8.0.21" puis enregistrez

Pour creer la base de donnees (N’oubliez pas de demarrer MAMP ou WAMP)

Executer la commande php bin/console doctrine:database:createou php bin/console d:d:c

Resultat

Created database ‘courssymfony‘ for connection named default

H & H: Research and Training 10 / 105

Page 17: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Entity

Symfony

Definition

correspond a une table d’une base de donnees relationnelle

est un objet contenant quelques informations indispensables pourle mapping (faire le lien) avec la base de donnees

Informations indispensables : les annotations

permettent de decrire les meta-donnees de l’entite

sont des commentaires speciaux (qui peuvent etre generes parSymfony sans les ecrire)

H & H: Research and Training 11 / 105

Page 18: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Entity

Symfony

Definition

correspond a une table d’une base de donnees relationnelle

est un objet contenant quelques informations indispensables pourle mapping (faire le lien) avec la base de donnees

Informations indispensables : les annotations

permettent de decrire les meta-donnees de l’entite

sont des commentaires speciaux (qui peuvent etre generes parSymfony sans les ecrire)

H & H: Research and Training 11 / 105

Page 19: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Entity

Symfony

3 etapes pour creer ou modifier une table associee a une entite

creer ou modifier une entite

creer une migration ⇒ generer le script SQL

appliquer la migration ⇒ executer le script

H & H: Research and Training 12 / 105

Page 20: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Entity Creation d’une entite

Symfony

Pour creer une entite

Executer la commande php bin/console make:entity

Repondre aux questions suivantes

Class name of the entity to create or update par Personne

New property name par nom

Field type par string

Can this field be null in the database (nullable) par no

Refaire la meme chose pour prenom et ensuite pour un attribut sexe delongueur 1

H & H: Research and Training 13 / 105

Page 21: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Entity Creation d’une entite

Symfony

Pour creer une entite

Executer la commande php bin/console make:entity

Repondre aux questions suivantes

Class name of the entity to create or update par Personne

New property name par nom

Field type par string

Can this field be null in the database (nullable) par no

Refaire la meme chose pour prenom et ensuite pour un attribut sexe delongueur 1

H & H: Research and Training 13 / 105

Page 22: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Entity Creation d’une entite

Symfony

Remarques

Les types Doctrine sont sensibles a la casse

La liste complete des types :https://www.doctrine-project.org/projects/doctrine-orm/en/current/reference/basic-mapping.html#doctrine-mapping-types

H & H: Research and Training 14 / 105

Page 23: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Entity Creation d’une entite

L’attribut $ id sera generee automatiquement

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/*** @ORM\Entity(repositoryClass="

App\Repository\PersonneRepository")

*/class Personne{

/*** @ORM\Id()* @ORM\GeneratedValue()* @ORM\Column(type="integer")*/private $id;

/**

* @ORM\Column(type="string",length=255)

*/private $nom;

/*** @ORM\Column(type="string",

length=255)*/private $prenom;

/*** @ORM\Column(type="string",

length=1)*/private $sexe;

// + les getters et setters}

Allez aussi verifier la creation de PersonneRepository dans src/Repository

H & H: Research and Training 15 / 105

Page 24: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Entity Creation d’une entite

L’attribut $ id sera generee automatiquement

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/*** @ORM\Entity(repositoryClass="

App\Repository\PersonneRepository")

*/class Personne{

/*** @ORM\Id()* @ORM\GeneratedValue()* @ORM\Column(type="integer")*/private $id;

/**

* @ORM\Column(type="string",length=255)

*/private $nom;

/*** @ORM\Column(type="string",

length=255)*/private $prenom;

/*** @ORM\Column(type="string",

length=1)*/private $sexe;

// + les getters et setters}

Allez aussi verifier la creation de PersonneRepository dans src/Repository

H & H: Research and Training 15 / 105

Page 25: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Entity Creation d’une entite

Symfony

Les differents types de Doctrine

Annotation designation@ORM\Entity marque qu’une classe PHP est une entite@ORM\Table decrit la table d’une entite persistante@ORM\Column definit les caracteristiques d’une colonne@ORM\Id marque l’identifiant de l’entite@ORM\GeneratedValue utilisee pour generer des identifiants annotes par @Id@ORM\OneToOne entite en relation avec une seule entite@ORM\OneToMany entite en relation avec plusieurs entites@ORM\ManyToMany entites en relation avec plusieurs entites

La liste complete d’annotations

https://www.doctrine-project.org/projects/doctrine-orm/en/current/reference/annotations-reference.html

H & H: Research and Training 16 / 105

Page 26: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Entity Creation d’une entite

Symfony

Les differents types de Doctrine

Annotation designation@ORM\Entity marque qu’une classe PHP est une entite@ORM\Table decrit la table d’une entite persistante@ORM\Column definit les caracteristiques d’une colonne@ORM\Id marque l’identifiant de l’entite@ORM\GeneratedValue utilisee pour generer des identifiants annotes par @Id@ORM\OneToOne entite en relation avec une seule entite@ORM\OneToMany entite en relation avec plusieurs entites@ORM\ManyToMany entites en relation avec plusieurs entites

La liste complete d’annotations

https://www.doctrine-project.org/projects/doctrine-orm/en/current/reference/annotations-reference.html

H & H: Research and Training 16 / 105

Page 27: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Entity Creation d’une entite

Symfony

Les annotations Doctrine 2 peuvent avoir des attributs.

@ORM\Entity

repositoryClass :

il permet de recuperer les entites depuis la base de donnees

il a comme valeur le nom du namespace complet du repository

le nom du repository est compose du nom de l’entite +Repository (pour notre exemple : PersonneRepository

readonly : precise que cette entite est en lecture seule

H & H: Research and Training 17 / 105

Page 28: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Entity Creation d’une entite

Symfony

Les annotations Doctrine 2 peuvent avoir des attributs.

@ORM\Entity

repositoryClass :

il permet de recuperer les entites depuis la base de donnees

il a comme valeur le nom du namespace complet du repository

le nom du repository est compose du nom de l’entite +Repository (pour notre exemple : PersonneRepository

readonly : precise que cette entite est en lecture seule

H & H: Research and Training 17 / 105

Page 29: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Entity Creation d’une entite

@ORM\Table

name : nom de la table

indexes : tableau d’annotations @index

@ORM\column

type : nom du type Doctrine (obligatoire)

name : nom de la colonne

length : longueur pour les chaınes de caractere

unique : pour indiquer l’unicite des valeurs de la colonnes

nullable : pour indiquer si la valeur null est acceptee

@ORM\GeneratedValue

strategy : nom de la strategie (AUTO, NONE...)

H & H: Research and Training 18 / 105

Page 30: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Entity Creation d’une entite

Symfony

La liste complete des attributs

https://www.doctrine-project.org/projects/doctrine-orm/en/current/reference/basic-mapping.html#property-mapping

H & H: Research and Training 19 / 105

Page 31: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Entity Creation de tables associees a des entites

Symfony

Creation d’une table a partir d’une entite

Executez la commande php bin/console make:migration pourgenerer le script de creation de la table

Verifiez le script SQL genere dans src/Migrations

Pour creer les tables, executez php bin/consoledoctrine:migrations:migrate (ou php bin/console d:m:m)

Verifier la creation de la table avec la console MySQL ou phpMyAdmin

H & H: Research and Training 20 / 105

Page 32: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Entity Creation de tables associees a des entites

Symfony

Creation d’une table a partir d’une entite

Executez la commande php bin/console make:migration pourgenerer le script de creation de la table

Verifiez le script SQL genere dans src/Migrations

Pour creer les tables, executez php bin/consoledoctrine:migrations:migrate (ou php bin/console d:m:m)

Verifier la creation de la table avec la console MySQL ou phpMyAdmin

H & H: Research and Training 20 / 105

Page 33: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Entity Modification entites/tables

Symfony

Modification d’une entite

Ajouter un attribut

Modifier le type d’un attribut

Supprimer un attribut

Ajouter/Modifier/Supprimer une/des contrainte(s) sur les attributs

H & H: Research and Training 21 / 105

Page 34: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Entity Modification entites/tables

Symfony

Exemple

Supprimons l’attribut sexe de la classe Personne ainsi que les getteret setter.

Pour regenerer la table dans la base de donnees, executez

php bin/console make:migration

php bin/console doctrine:migrations:migrate

Verifier les modifications avec la console MySQL ou phpMyAdmin

H & H: Research and Training 22 / 105

Page 35: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Entity Modification entites/tables

Symfony

Exemple

Supprimons l’attribut sexe de la classe Personne ainsi que les getteret setter.

Pour regenerer la table dans la base de donnees, executez

php bin/console make:migration

php bin/console doctrine:migrations:migrate

Verifier les modifications avec la console MySQL ou phpMyAdmin

H & H: Research and Training 22 / 105

Page 36: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Entity Modification entites/tables

Symfony

Exemple

Supprimons l’attribut sexe de la classe Personne ainsi que les getteret setter.

Pour regenerer la table dans la base de donnees, executez

php bin/console make:migration

php bin/console doctrine:migrations:migrate

Verifier les modifications avec la console MySQL ou phpMyAdmin

H & H: Research and Training 22 / 105

Page 37: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Entity Modification entites/tables

Symfony

Pour ajouter un nouvel attribut, on peut

executer la commande php bin/console make:entity

preciser le nom d’une entite existante

preciser les nouveaux attributs (comme dans le cas d’unecreation)

Faire la migration

H & H: Research and Training 23 / 105

Page 38: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

EntityManager et Repository

Symfony

Comment ca marche avec Doctrine?

Pour la lecture, on utilise le PersonneRepository

Pour l’ecriture, on utilise EntityManager

H & H: Research and Training 24 / 105

Page 39: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

EntityManager et Repository

Symfony

Entity Manager

un service Doctrine (Doctrine est un service Symfony)

permettant la manipulation de nos entites

Le service Doctrine

$doctrine = $this->get(’doctrine’); ou

$doctrine = $this->getDoctrine(); (un raccourci)

H & H: Research and Training 25 / 105

Page 40: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

EntityManager et Repository

Symfony

Entity Manager

un service Doctrine (Doctrine est un service Symfony)

permettant la manipulation de nos entites

Le service Doctrine

$doctrine = $this->get(’doctrine’); ou

$doctrine = $this->getDoctrine(); (un raccourci)

H & H: Research and Training 25 / 105

Page 41: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

EntityManager et Repository

Symfony

Le service Entity Manager

$em = $this->getDoctrine()->getManager(); ou

$em = $this->get(’doctrine.orm.entity manager’);

ou en injectant le service EntityManagerInterface dans une methode

Le service Repository

$em = $this->getDoctrine()->getRepository(EntityName::class); ou

ou en injectant le service EntityNameRepository dans une methode

Pour tester, creons un controleur PersonneController

H & H: Research and Training 26 / 105

Page 42: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

EntityManager et Repository

Symfony

Le service Entity Manager

$em = $this->getDoctrine()->getManager(); ou

$em = $this->get(’doctrine.orm.entity manager’);

ou en injectant le service EntityManagerInterface dans une methode

Le service Repository

$em = $this->getDoctrine()->getRepository(EntityName::class); ou

ou en injectant le service EntityNameRepository dans une methode

Pour tester, creons un controleur PersonneController

H & H: Research and Training 26 / 105

Page 43: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

EntityManager et Repository

Symfony

Le service Entity Manager

$em = $this->getDoctrine()->getManager(); ou

$em = $this->get(’doctrine.orm.entity manager’);

ou en injectant le service EntityManagerInterface dans une methode

Le service Repository

$em = $this->getDoctrine()->getRepository(EntityName::class); ou

ou en injectant le service EntityNameRepository dans une methode

Pour tester, creons un controleur PersonneController

H & H: Research and Training 26 / 105

Page 44: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

EntityManager et Repository

SymfonyContenu de PersonneController.php

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;

use Symfony\Component\Routing\Annotation\Route;

class PersonneController extends AbstractController{

/*** @Route("/personne", name="personne")*/

public function index(){

return $this->render(’personne/index.html.twig’, [’controller_name’ => ’PersonneController’,

]);}

}

H & H: Research and Training 27 / 105

Page 45: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

EntityManager et Repository

Symfony

Pour personne/index.html.twig, considerons le contenu suivant

{% extends ’base.html.twig’ %}

{% block title %}Hello PersonneController!{% endblock %}

{% block body %}<h1>Hello

{{ controller_name }}!</h1>{% if personne is defined %}

Personne{{ adjectif }} :{{ personne.id }}{{ personne.prenom }}{{ personne.nom }}

{% endif %}{% endblock %}

H & H: Research and Training 28 / 105

Page 46: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

EntityManager et Repository Insertion

Symfony

Pour ajouter un tuple dans la table Personne

/*** @Route("/personne/add", name="personne_add")

*/public function addPersonne(){

$personne = new Personne();$personne->setNom(’Wick’);$personne->setPrenom(’John’);$entityManager = $this->getDoctrine()->getManager();$entityManager->persist($personne);$entityManager->flush();return $this->render(’personne/index.html.twig’, [

’controller_name’ => ’PersonneController’,’personne’ => $personne,’adjectif’ => ’ajoutee’

]);}

H & H: Research and Training 29 / 105

Page 47: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

EntityManager et Repository Insertion

SymfonyOn peut aussi injecter le gestionnaire d’entite dans l’action

/*** @Route("/personne/add", name="personne_add")*/public function addPersonne(EntityManagerInterface $entityManager){

$personne = new Personne();$personne->setNom(’Wick’);$personne->setPrenom(’John’);$entityManager->persist($personne);$entityManager->flush();return $this->render(’personne/index.html.twig’, [

’controller_name’ => ’PersonneController’,’personne’ => $personne,’adjectif’ => ’ajoutee’

]);}

Le namespace de EntityManagerInterface

use Doctrine\ORM\EntityManagerInterface;

H & H: Research and Training 30 / 105

Page 48: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

EntityManager et Repository Insertion

Explication

$entityManager->persist($personne); : informe Doctrine que l’on veut ajoutercet objet dans la base de donnees.

$em->flush(); : permet d’executer la requete et d’envoyer tout ce qui a ete persisteavant a la base de donnees.

Utilisez le profiler pour mieux comprendre le fonctionnement

Allez a la page http://localhost:8000/ profiler/14d964?panel=db

Verifiez la presence de 3 Queries

Symfony utilise les transactions pour les operations sur une base de donnees

START TRANSACTION

INSERT INTO ...

COMMIT

H & H: Research and Training 31 / 105

Page 49: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

EntityManager et Repository Insertion

Explication

$entityManager->persist($personne); : informe Doctrine que l’on veut ajoutercet objet dans la base de donnees.

$em->flush(); : permet d’executer la requete et d’envoyer tout ce qui a ete persisteavant a la base de donnees.

Utilisez le profiler pour mieux comprendre le fonctionnement

Allez a la page http://localhost:8000/ profiler/14d964?panel=db

Verifiez la presence de 3 Queries

Symfony utilise les transactions pour les operations sur une base de donnees

START TRANSACTION

INSERT INTO ...

COMMIT

H & H: Research and Training 31 / 105

Page 50: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

EntityManager et Repository Insertion

Explication

$entityManager->persist($personne); : informe Doctrine que l’on veut ajoutercet objet dans la base de donnees.

$em->flush(); : permet d’executer la requete et d’envoyer tout ce qui a ete persisteavant a la base de donnees.

Utilisez le profiler pour mieux comprendre le fonctionnement

Allez a la page http://localhost:8000/ profiler/14d964?panel=db

Verifiez la presence de 3 Queries

Symfony utilise les transactions pour les operations sur une base de donnees

START TRANSACTION

INSERT INTO ...

COMMIT

H & H: Research and Training 31 / 105

Page 51: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

EntityManager et Repository Insertion

Pour verifier si les valeurs sont valides avant insertion, on peut utiliserValidatorInterface

public function addPersonne(EntityManagerInterface $entityManager,ValidatorInterface $validator)

{$personne = new Personne();$personne->setNom(’Wick’);$personne->setPrenom(’John’);$errors = $validator->validate($personne);if (count($errors) > 0) {

return new Response((string) $errors, 400);}$entityManager->persist($personne);$entityManager->flush();return $this->render(’personne/index.html.twig’, [

’controller_name’ => ’PersonneController’,’personne’ => $personne,’adjectif’ => ’ajoutee’

]);}

Le namespace de ValidatorInterface

use Symfony\Component\Validator\Validator\ValidatorInterface;

H & H: Research and Training 32 / 105

Page 52: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

EntityManager et Repository Insertion

Symfony

Si on ne choisit pas la version complete a la creation du projet

composer require symfony/validator

H & H: Research and Training 33 / 105

Page 53: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

EntityManager et Repository Insertion

Symfony

Contraintes verifiees par Symfony

Type

NotNull

UniqueEntity

Length

H & H: Research and Training 34 / 105

Page 54: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

EntityManager et Repository Consultation

Symfony

Quatre methodes predefinies pour la recherche

find : cherche et retourne un seul tuple selon la cle primaire

findOneBy : cherche et retourne un seul tuple selon lescolonnes donnees en parametre dans un tableau associatif

findBy : cherche et retourne plusieurs tuples selon les colonnesdonnees en parametre dans un tableau associatif

findAll : retourne tous les tuples de la table.

H & H: Research and Training 35 / 105

Page 55: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

EntityManager et Repository Consultation

SymfonyExemple avec find (la methode est a placer apres addPersonne)

/*** @Route("/personne/{id}", name="personne_show")*/public function showPersonne(int $id, PersonneRepository

$personneRepository){

$personne = $personneRepository->find($id);

if (!$personne) {throw $this->createNotFoundException(

’Personne non trouvee avec l\’id ’ . $id);

}

return $this->render(’personne/index.html.twig’, [’controller_name’ => ’PersonneController’,’personne’ => $personne,’adjectif’ => ’recherchee’

]);}

H & H: Research and Training 36 / 105

Page 56: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

EntityManager et Repository Consultation

Symfony

Rien a changer dans personne/index.html.twig

{% extends ’base.html.twig’ %}

{% block title %}Hello PersonneController!{% endblock %}

{% block body %}<h1>Hello

{{ controller_name }}!</h1>{% if personne is defined %}

Personne{{ adjectif }} :{{ personne.id }}{{ personne.prenom }}{{ personne.nom }}

{% endif %}{% endblock %}

H & H: Research and Training 37 / 105

Page 57: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

EntityManager et Repository Consultation

Exemple avec findOneBy (la methode est a placer apres showPersonne)

/*** @Route("/personne/{nom}/{prenom}", name="personne_show_one")*/public function showPersonneByNomAndPrenom(string $nom, string $prenom,

PersonneRepository $personneRepository){

$personne = $personneRepository->findOneBy(["nom" => $nom,"prenom" => $prenom

]);

if (!$personne) {throw $this->createNotFoundException(’Personne non trouvee’);

}

return $this->render(’personne/index.html.twig’, [’controller_name’ => ’PersonneController’,’personne’ => $personne,’adjectif’ => ’recherchee’

]);}

H & H: Research and Training 38 / 105

Page 58: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

EntityManager et Repository Consultation

Symfony

Exemple avec findAll (la methode est a placer apres addPersonne)

/*** @Route("/personne/show", name="personne_show_all")*/public function showAllPersonne(PersonneRepository $personneRepository){

$personnes = $personneRepository->findAll();

if (!$personnes) {throw $this->createNotFoundException(’La table est vide’);

}

return $this->render(’personne/show.html.twig’, [’controller_name’ => ’PersonneController’,’personnes’ => $personnes,

]);}

H & H: Research and Training 39 / 105

Page 59: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

EntityManager et Repository Consultation

Symfony

Contenu de show.html.twig

{% extends ’base.html.twig’ %}

{% block title %}Hello PersonneController!{% endblock %}

{% block body %}

<h1>Hello {{ controller_name }}!</h1><ul>

{% for personne in personnes %}<li>{{ personne.prenom }} {{ personne.nom }}</li>

{% endfor %}</ul>

{% endblock %}

H & H: Research and Training 40 / 105

Page 60: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

EntityManager et Repository Modification

SymfonyPour modifier une personne, il faut la recuperer avant avec personneRepository

/*** @Route("/personne/edit/{id}", name="personne_update")*/public function updatePersonne(int $id, EntityManagerInterface

$entityManager){

$personne = $entityManager->getRepository(Personne::class)->find($id);

if (!$personne) {throw $this->createNotFoundException(

’Personne non trouvee avec l\’id ’ . $id);

}$personne->setNom(’Travolta’);$entityManager->flush();return $this->render(’personne/index.html.twig’, [

’controller_name’ => ’PersonneController’,’personne’ => $personne,’adjectif’ => ’modifiee’

]);}

H & H: Research and Training 41 / 105

Page 61: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

EntityManager et Repository Modification

SymfonySymfony nous permet de recuperer l’objet personne dont l’identifiant est passe enparametre dans la barre d’adresse

/*** @Route("/personne/edit/{id}", name="personne_update")*/public function updatePersonne(Personne $personne,

EntityManagerInterface $entityManager){

if (!$personne) {throw $this->createNotFoundException(

’Personne non trouvee avec l\’id ’ . $personne->id);

}$personne->setNom(’Abruzzi’);$entityManager->flush();return $this->render(’personne/index.html.twig’, [

’controller_name’ => ’PersonneController’,’personne’ => $personne,’adjectif’ => ’modifiee’

]);}

H & H: Research and Training 42 / 105

Page 62: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

EntityManager et Repository Suppression

SymfonyPour supprimer une personne, il faut aussi la recuperer avant avecpersonneRepository

/*** @Route("/personne/delete/{id}", name="personne_delete")*/

public function deletePersonne(int $id, EntityManagerInterface$entityManager)

{$personne = $entityManager->getRepository(Personne::class)

->find($id);if (!$personne) {

throw $this->createNotFoundException(’Personne non trouvee avec l\’id ’ . $id

);}$entityManager->remove($personne);$entityManager->flush();return $this->redirectToRoute("personne_show_all");

}

H & H: Research and Training 43 / 105

Page 63: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

EntityManager et Repository Autres methodes d’EntityManager

Symfony

Autres methodes

clear() : annule tous les persist effectues parl’EntityManager

detach($entity) : annule le persist effectue parl’EntityManager sur $entity

refresh($entity) : remet a jour l’entite en argument par lesvaleurs de la base de donnees. Les nouvelles modifications surcette entite seront perdues.

contains($entity) : retourne true si $entity est geree parEntityManager.

H & H: Research and Training 44 / 105

Page 64: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Repository

Symfony

Repository

une classe PHP

contenant les methodes de recuperation de donnees relatives anos entites

pouvant etre utilise pour

definir des nouvelles methodes

personnaliser des methodes existantes

H & H: Research and Training 45 / 105

Page 65: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Repository

Symfony

La methode findBy()

Elle peut prendre plusieurs parametres

un tableau de contraintes pour le where, obligatoire

un tableau de contraintes pour le orderBy, par defaut

une valeur pour limit, par defaut

une valeur pour offset, par defaut

H & H: Research and Training 46 / 105

Page 66: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Repository

Exemple avec findBy()

/*** @Route("/personne/show/{nom}/{prenom}/{number}", name="

personne_show_some")*/public function showSomePersonne(string $nom, string $prenom, int

$number, PersonneRepository $personneRepository){

$personnes = $personneRepository->findBy([

"nom" => $nom,"prenom" => $prenom

],["nom" => "ASC"],$number,1

);if (!$personnes) {

throw $this->createNotFoundException(’Aucun resultat trouve’);}return $this->render(’personne/show.html.twig’, [

’controller_name’ => ’PersonneController’,’personnes’ => $personnes,

]);}

H & H: Research and Training 47 / 105

Page 67: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Repository

Symfony

Les methodes magiques

findByAttribut($valeur) : retourne un tableau de tous les tuples dontAttribut a comme valeur $valeur)

findOneByAttribut($valeur) : retourne un seul tuple dont Attribut acomme valeur $valeur

Pour notre entite Personne, on peut avoir

findByNom()

findByPrenom()

findOneByNom()

findOneByPrenom()

H & H: Research and Training 48 / 105

Page 68: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Repository

Symfony

Les methodes magiques

findByAttribut($valeur) : retourne un tableau de tous les tuples dontAttribut a comme valeur $valeur)

findOneByAttribut($valeur) : retourne un seul tuple dont Attribut acomme valeur $valeur

Pour notre entite Personne, on peut avoir

findByNom()

findByPrenom()

findOneByNom()

findOneByPrenom()

H & H: Research and Training 48 / 105

Page 69: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Repository Query Builder

Symfony

Query Builder

Dans la classe PersonneRepository, on definit une methodequi

utilise un objet QueryBuilder : on l’obtient avec la methodecreateQueryBuilder() de l’EntityManager et on l’utilisepour construire la requete

recupere l’objet Query de QueryBuilder

recupere les resultats de la Query

retourne le resultat

H & H: Research and Training 49 / 105

Page 70: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Repository Query Builder

Symfony

Definissons notre methode dans la classe PersonneRepository

public function findOneByNomAndPrenom(string $nom,string $prenom)

{$queryBuilder = $this->createQueryBuilder(’p’)

->where(’p.nom = :nom’)->setParameter(’nom’, $nom)->andWhere(’p.prenom = :prenom’)->setParameter(’prenom’, $prenom);

$query = $queryBuilder->getQuery();$result = $query->setMaxResults(1)->

getOneOrNullResult();return $result;

}

H & H: Research and Training 50 / 105

Page 71: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Repository Query Builder

Symfony

Modifions showPersonneByNomAndPrenom dans PersonneController

/*** @Route("/personne/{nom}/{prenom}", name="personne_show_one")*/public function showPersonneByNomAndPrenom(string $nom, string $prenom,

PersonneRepository $personneRepository){

$personne = $personneRepository->findOneByNomAndPrenom($nom,$prenom);

if (!$personne) {throw $this->createNotFoundException(’Personne non trouvee’);

}

return $this->render(’personne/index.html.twig’, [’controller_name’ => ’PersonneController’,’personne’ => $personne,’adjectif’ => ’recherchee’

]);}

H & H: Research and Training 51 / 105

Page 72: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Repository Query Builder

Symfony

Autres methodes de Query

getResult() : Execute la requete et retourne le resultat sous forme d’untableau d’objets (meme quand il s’agit d’un seul objet)

getArrayResult() : Execute la requete et retourne le resultat sous formed’un tableau de tableaux

getScalarResult() : Execute la requete et retourne le resultat sous formed’une valeur (a utiliser lorsque la requete retourne une unique valeur)

getOneOrNullResult() : Execute la requete et retourne un seul objet ou unevaleur null

Plusieurs autres : getSingleResult(), getSingleScalarResult()...

execute() : a utiliser pour executer des requetes insert, update, deleteou select

H & H: Research and Training 52 / 105

Page 73: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Repository DQL

Symfony

DQL

Langage de requetes adapte a Doctrine

Contrairement a QueryBuilder, DQL permet d’ecrire desrequetes sous forme de chaınes de caracteres

Remarques

Pas besoin de QueryBuilder pour construire les requetes

Par contre, on doit passer par la methode createQuery()

Et on a toujours besoin de Query pour recuperer les resultats

H & H: Research and Training 53 / 105

Page 74: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Repository DQL

Symfony

DQL

Langage de requetes adapte a Doctrine

Contrairement a QueryBuilder, DQL permet d’ecrire desrequetes sous forme de chaınes de caracteres

Remarques

Pas besoin de QueryBuilder pour construire les requetes

Par contre, on doit passer par la methode createQuery()

Et on a toujours besoin de Query pour recuperer les resultats

H & H: Research and Training 53 / 105

Page 75: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Repository DQL

Symfony

Modifions la methode findOneByNomAndPrenom de la PersonneRepository etutilisons DQL

public function findOneByNomAndPrenom(string $nom, string$prenom)

{$entityManager = $this->getEntityManager();

$query = $entityManager->createQuery(’SELECT pFROM App\Entity\Personne pWHERE p.nom = :nomand p.prenom = :prenom’

)->setParameter(’nom’, $nom)->setParameter(’prenom’, $prenom);

$result = $query->setMaxResults(1)->getOneOrNullResult();return $result;

}

H & H: Research and Training 54 / 105

Page 76: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Repository DQL

Symfony

La methode showPersonneByNomAndPrenom de PersonneController reste inchangee

/*** @Route("/personne/{nom}/{prenom}", name="personne_show_one")*/public function showPersonneByNomAndPrenom(string $nom, string $prenom,

PersonneRepository $personneRepository){

$personne = $personneRepository->findOneByNomAndPrenom($nom,$prenom);

if (!$personne) {throw $this->createNotFoundException(’Personne non trouvee’);

}

return $this->render(’personne/index.html.twig’, [’controller_name’ => ’PersonneController’,’personne’ => $personne,’adjectif’ => ’recherchee’

]);}

H & H: Research and Training 55 / 105

Page 77: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Repository DQL

Symfony

Tester une requete DQL avec la Console

Executer php bin/console doctrine:query:dql "requeteDQL"

Exemple

Executerphp bin/console doctrine:query:dql "SELECT p FROMApp\Entity\Personne p"

H & H: Research and Training 56 / 105

Page 78: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Repository DQL

Symfony

Tester une requete DQL avec la Console

Executer php bin/console doctrine:query:dql "requeteDQL"

Exemple

Executerphp bin/console doctrine:query:dql "SELECT p FROMApp\Entity\Personne p"

H & H: Research and Training 56 / 105

Page 79: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Repository DQL

Symfony

Remarques

La requete DQL precedente permet de selectionner un objet

Il est tout de meme possible de selectionner seulement quelquesattributs d’un objet

Dans ce cas, le resultat est un tableau contenant les champsselectionnes

Cependant, il est impossible de modifier (ou supprimer) lesvaleurs de ces attributs selectionnees

H & H: Research and Training 57 / 105

Page 80: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Repository SQL

Symfony

Modifions la methode findOneByNomAndPrenom de la PersonneRepository etutilisons SQL

public function findOneByNomAndPrenom(string $nom, string$prenom)

{$entityManager = $this->getEntityManager();

$query = $entityManager->getConnection()->prepare(’SELECT *

FROM personneWHERE nom = :nomand prenom = :prenom’

);$query->execute(array(’nom’ => $nom, "prenom" => $prenom));$result = $query->fetch();return $result;

}

H & H: Research and Training 58 / 105

Page 81: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Relation entre entites

Symfony

Quatre (ou trois) relations possibles

OneToOne : chaque objet d’une premiere classe est en relationavec un seul objet de la deuxieme classe

OneToMany : chaque objet d’une premiere classe peut etre enrelation avec plusieurs objets de la deuxieme classe (lareciproque est ManyToOne)

ManyToMany : chaque objet d’une premiere classe peut etre enrelation avec plusieurs objets de la deuxieme classe etinversement

H & H: Research and Training 59 / 105

Page 82: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Relation entre entites OneToOne

Symfony

Pour la suite

Creons une entite Adresse avec la commande phpbin/console make:entity

Cette entite a trois attributs :

rue (string de taille 30),

codePostal (string de taille 5) et

ville (string de taille 30)

H & H: Research and Training 60 / 105

Page 83: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Relation entre entites OneToOne

Symfony

Contenu de l’entite Adresse

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/*** @ORM\Entity(repositoryClass="

App\Repository\AdresseRepository")

*/class Adresse{

/*** @ORM\Id()* @ORM\GeneratedValue()* @ORM\Column(type="integer")*/private $id;

/*** @ORM\Column(type="string",

length=30)*/private $rue;

/*** @ORM\Column(type="string",

length=5)*/private $codePostal;

/*** @ORM\Column(type="string",

length=30)*/private $ville;

H & H: Research and Training 61 / 105

Page 84: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Relation entre entites OneToOne

Symfony

Pour ajouter Adresse dans Personne

executez la commande php bin/console make:entity

repondez a Class name of the entity to create or update par Personne

repondez a New property name par adresse

repondez a Field type par OneToOne

repondez a What class should this entity be related to? par Adresse

repondez a Is the Personne.adresse property allowed to be null(nullable)? par yes

repondez a Do you want to add a new property to Adresse so that youcan access/update Personne par no

cliquez sur entree pour repondre a Add another property?

H & H: Research and Training 62 / 105

Page 85: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Relation entre entites OneToOne

Nouveau contenu de Personne

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/*** @ORM\Entity(repositoryClass="App\Repository\PersonneRepository")*/class Personne{.../*** @ORM\OneToOne(targetEntity="App\Entity\Adresse", cascade={"remove

"})*/private $adresse;...

}

Notation

Personne : entite proprietaire

Adresse : entite inverse

H & H: Research and Training 63 / 105

Page 86: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Relation entre entites OneToOne

Nouveau contenu de Personne

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/*** @ORM\Entity(repositoryClass="App\Repository\PersonneRepository")*/class Personne{.../*** @ORM\OneToOne(targetEntity="App\Entity\Adresse", cascade={"remove

"})*/private $adresse;...

}

Notation

Personne : entite proprietaire

Adresse : entite inverse

H & H: Research and Training 63 / 105

Page 87: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Relation entre entites OneToOne

Symfony

/*** @ORM\OneToOne(targetEntity="App\Entity\Adresse", cascade={"remove

"})*/

Explication

targetEntity : namespace complet vers l’entite liee.

cascade : permet de cascader les operations comme persist, remove qu’on peutfaire de l’entite proprietaire a l’entite inverse.

On peut aussi ajouter

* @ORM\JoinColumn(nullable=false)

Pour indiquer que chaque personne doit avoir une adresse. Par defaut, c’est facultatif.

H & H: Research and Training 64 / 105

Page 88: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Relation entre entites OneToOne

Symfony

/*** @ORM\OneToOne(targetEntity="App\Entity\Adresse", cascade={"remove

"})*/

Explication

targetEntity : namespace complet vers l’entite liee.

cascade : permet de cascader les operations comme persist, remove qu’on peutfaire de l’entite proprietaire a l’entite inverse.

On peut aussi ajouter

* @ORM\JoinColumn(nullable=false)

Pour indiquer que chaque personne doit avoir une adresse. Par defaut, c’est facultatif.

H & H: Research and Training 64 / 105

Page 89: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Relation entre entites OneToOne

Symfony

/*** @ORM\OneToOne(targetEntity="App\Entity\Adresse", cascade={"remove

"})*/

Explication

targetEntity : namespace complet vers l’entite liee.

cascade : permet de cascader les operations comme persist, remove qu’on peutfaire de l’entite proprietaire a l’entite inverse.

On peut aussi ajouter

* @ORM\JoinColumn(nullable=false)

Pour indiquer que chaque personne doit avoir une adresse. Par defaut, c’est facultatif.

H & H: Research and Training 64 / 105

Page 90: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Relation entre entites OneToOne

Symfony

Pour regenerer la table dans la base de donnees, executez

php bin/console make:migration

php bin/console doctrine:migrations:migrate

Verifier les modifications avec la console MySQL ou phpMyAdmin

H & H: Research and Training 65 / 105

Page 91: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Relation entre entites OneToOne

Symfony

Pour regenerer la table dans la base de donnees, executez

php bin/console make:migration

php bin/console doctrine:migrations:migrate

Verifier les modifications avec la console MySQL ou phpMyAdmin

H & H: Research and Training 65 / 105

Page 92: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Relation entre entites OneToOne

Modifions addPersonne pour ajouter une personne avec une adresse

/*** @Route("/personne/add", name="personne_add")*/function addPersonne(EntityManagerInterface $entityManager){

$adresse = new Adresse();$adresse->setRue(’paradis’);$adresse->setVille(’Marseille’);$adresse->setCodePostal(’13015’);$entityManager->persist($adresse);$personne = new Personne();$personne->setNom(’Wick’);$personne->setPrenom(’John’);$personne->setAdresse($adresse);$entityManager->persist($personne);$entityManager->flush();return $this->render(’personne/index.html.twig’, [

’controller_name’ => ’PersonneController’,’personne’ => $personne,’adjectif’ => ’ajoutee’

]);}

H & H: Research and Training 66 / 105

Page 93: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Relation entre entites OneToOne

SymfonyModifions l’entite Personne pour eviter de persister les adresses avant

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/*** @ORM\Entity(repositoryClass="App\Repository\

PersonneRepository")*/

class Personne{.../*** @ORM\OneToOne(targetEntity="App\Entity\Adresse", cascade

={"remove", "persist"})*/

private $adresse;...

}

H & H: Research and Training 67 / 105

Page 94: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Relation entre entites OneToOne

Ainsi pour ajouter une personne

/*** @Route("/personne/add", name="personne_add")*/function addPersonne(EntityManagerInterface $entityManager){

$adresse = new Adresse();$adresse->setRue(’paradis’);$adresse->setVille(’Marseille’);$adresse->setCodePostal(’13015’);$personne = new Personne();$personne->setNom(’Wick’);$personne->setPrenom(’John’);$personne->setAdresse($adresse);$entityManager->persist($personne);$entityManager->flush();return $this->render(’personne/index.html.twig’, [

’controller_name’ => ’PersonneController’,’personne’ => $personne,’adjectif’ => ’ajoutee’

]);}

H & H: Research and Training 68 / 105

Page 95: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Relation entre entites ManyToOne

SymfonyExemple

Si plusieurs personnes pouvaient avoir la meme adresse.

personne1

personne2

.

.

.

personneN

adresse

Many To One

H & H: Research and Training 69 / 105

Page 96: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Relation entre entites ManyToOne

Symfony

Il suffit de changer

/*** @ORM\ManyToOne(targetEntity=Adresse::class,

cascade={"remove", "persist"})

* @ORM\JoinColumn(nullable=true)

*/

H & H: Research and Training 70 / 105

Page 97: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Relation entre entites ManyToOne

Symfony

Pour regenerer les tables dans la base de donnees, executez

php bin/console make:migration

php bin/console doctrine:migrations:migrate

Verifier les modifications avec la console MySQL ou phpMyAdmin

H & H: Research and Training 71 / 105

Page 98: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Relation entre entites ManyToOne

Symfony

Pour regenerer les tables dans la base de donnees, executez

php bin/console make:migration

php bin/console doctrine:migrations:migrate

Verifier les modifications avec la console MySQL ou phpMyAdmin

H & H: Research and Training 71 / 105

Page 99: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Relation entre entites ManyToOne

Pour tester

/* adresse */$adresse = new Adresse();$adresse->setRue(’paradis’);$adresse->setVille(’Marseille’);$adresse->setCodePostal(’13015’);

/* premiere personne */$personne = new Personne();$personne->setNom(’Cohen’);$personne->setPrenom(’Sophie’);$personne->setAdresse($adresse);

/* deuxieme personne */$personne2 = new Personne();$personne2->setNom(’Wolf’);$personne2->setPrenom(’Bob’);$personne2->setAdresse($adresse);

/* persistance de donnees */$entityManager->persist($personne);$entityManager->persist($personne2);$entityManager->flush();

H & H: Research and Training 72 / 105

Page 100: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Relation entre entites ManyToMany

Exemple

Une personne peut pratiquer plusieurs sports

Un sport peut etre pratique par plusieurs personnes

personne1

personne2

.

.

.

personneN

sport1

sport2

.

.

.

sportM

Many To Many

H & H: Research and Training 73 / 105

Page 101: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Relation entre entites ManyToMany

Symfony

Demarche

On commence par creer une entite Sport avec un seul attributname

On definit la relation ManyToMany (exactement comme pour lesdeux relations precedentes) soit dans Personne soit dans Sport

H & H: Research and Training 74 / 105

Page 102: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Relation entre entites ManyToMany

Contenu de l’entite Sport

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/*** @ORM\Entity(repositoryClass="App\Repository\SportRepository")*/class Sport{

/*** @ORM\Id()* @ORM\GeneratedValue()* @ORM\Column(type="integer")*/private $id;

/*** @ORM\Column(type="string", length=255)*/private $name;

// + getters et setters}

H & H: Research and Training 75 / 105

Page 103: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Relation entre entites ManyToMany

Symfony

Pour ajouter Sport dans Personne

executez la commande php bin/console make:entity

repondez a Class name of the entity to create or update par Personne

repondez a New property name par sports

repondez a Field type par ManyToMany

repondez a What class should this entity be related to? par Sport

repondez a Is the Personne.sports property allowed to be null(nullable)? par yes

repondez a Do you want to add a new property to Sport so that youcan access/update Personne par no

cliquez sur entree pour repondre a Add another property?

H & H: Research and Training 76 / 105

Page 104: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Relation entre entites ManyToMany

Symfony

Pour regenerer les tables dans la base de donnees, executez

php bin/console make:migration

php bin/console doctrine:migrations:migrate

Verifier les modifications avec la console MySQL ou phpMyAdmin

H & H: Research and Training 77 / 105

Page 105: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Relation entre entites ManyToMany

Symfony

Pour regenerer les tables dans la base de donnees, executez

php bin/console make:migration

php bin/console doctrine:migrations:migrate

Verifier les modifications avec la console MySQL ou phpMyAdmin

H & H: Research and Training 77 / 105

Page 106: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Relation entre entites ManyToMany

SymfonyPour tester

$sport = new Sport();$sport->setName(’Football’);

$sport2 = new Sport();$sport2->setName(’Tennis’);

$personne = new Personne();$personne->setNom(’Dalton’);$personne->setPrenom(’Jack’);$personne->addSport($sport);$personne->addSport($sport2);

$personne2 = new Personne();$personne2->setNom(’Benamar’);$personne2->setPrenom(’Karim’);$personne2->addSport($sport);

$entityManager->persist($personne);$entityManager->persist($personne2);$entityManager->flush();

H & H: Research and Training 78 / 105

Page 107: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Relation entre entites Association porteuse de donnees

Symfony

Si l’association est porteuse de donnees

Par exemple : la relation (ArticleCommande) entre Commande et Article

Pour chaque article d’une commande, il faut preciser la quantite commandee.

Solution

Creer trois entites Article, Commande et ArticleCommande

Definir la relation OneToMany entre Article et ArticleCommande

Definir la relation ManyToOne entre ArticleCommande et Commande

La relation OneToMany est l’inverse de ManyToOne

H & H: Research and Training 79 / 105

Page 108: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Relation entre entites Association porteuse de donnees

Symfony

Si l’association est porteuse de donnees

Par exemple : la relation (ArticleCommande) entre Commande et Article

Pour chaque article d’une commande, il faut preciser la quantite commandee.

Solution

Creer trois entites Article, Commande et ArticleCommande

Definir la relation OneToMany entre Article et ArticleCommande

Definir la relation ManyToOne entre ArticleCommande et Commande

La relation OneToMany est l’inverse de ManyToOne

H & H: Research and Training 79 / 105

Page 109: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Relation entre entites Relation bidirectionnelle

Symfony

Remarques

Les relations, qu’on a etudiees, sont unidirectionnelles

C’est a dire on peut faire $personne->getAdresse()

Mais on ne peut faire $adresse->getPersonne()

Solution

Rendre les relations bidirectionnelles

Avant de commencer

Supprimons tout ce qui concerne Adresse dans Personne.

H & H: Research and Training 80 / 105

Page 110: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Relation entre entites Relation bidirectionnelle

Symfony

Remarques

Les relations, qu’on a etudiees, sont unidirectionnelles

C’est a dire on peut faire $personne->getAdresse()

Mais on ne peut faire $adresse->getPersonne()

Solution

Rendre les relations bidirectionnelles

Avant de commencer

Supprimons tout ce qui concerne Adresse dans Personne.

H & H: Research and Training 80 / 105

Page 111: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Relation entre entites Relation bidirectionnelle

Symfony

Remarques

Les relations, qu’on a etudiees, sont unidirectionnelles

C’est a dire on peut faire $personne->getAdresse()

Mais on ne peut faire $adresse->getPersonne()

Solution

Rendre les relations bidirectionnelles

Avant de commencer

Supprimons tout ce qui concerne Adresse dans Personne.

H & H: Research and Training 80 / 105

Page 112: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Relation entre entites Relation bidirectionnelle

Symfony

Demarche

Executez la commande php bin/console make:entity

Class name of the entity to create or update : Personne

New property name : adresse

Field type : ManyToOne

What class should this entity be related to : Adresse

Is the Personne.adresse property allowed to be null (nullable)?(yes/no) [yes]: : yes

Do you want to add a new property to Adresse so that you canaccess/update Personne objects from it - e.g.$adresse->getPersonnes() m? (yes/no) [yes]: : yes

New field name inside Adresse [personnes]: : personnes

Cliquez sur entrez

H & H: Research and Training 81 / 105

Page 113: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Relation entre entites Relation bidirectionnelle

Contenu d’Adresse.php

/*** @ORM\Entity(repositoryClass=AdresseRepository::class)*/class Adresse{...

/*** @ORM\OneToMany(targetEntity=Personne::class, mappedBy="adresse")*/private $personnes;

public function __construct(){

$this->personnes = new ArrayCollection();}

...}

mappedBy fait reference a l’attribut adresse dans la classe Personne

H & H: Research and Training 82 / 105

Page 114: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Relation entre entites Relation bidirectionnelle

Symfony

Contenu de Personne.php

/*** @ORM\Entity(repositoryClass=PersonneRepository::class)*/class Personne{

...

/*** @ORM\ManyToOne(targetEntity=Adresse::class, inversedBy="

personnes")*/private $adresse;

...}

inversedBy fait reference a l’attribut personnes dans la classe Adresse

H & H: Research and Training 83 / 105

Page 115: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Relation entre entites Relation bidirectionnelle

Symfony

Ainsi, on peut faire :

$adresse = new Adresse();$adresse->setRue(’10 rue de Lyon’);$adresse->setVille(’Marseille’);$adresse->setCodePostal(13015);$personne = new Personne();$personne->setNom(’Wick’);$personne->setPrenom(’John’);$personne->setAdresse($adresse);$adresse->getPersonnes();

H & H: Research and Training 84 / 105

Page 116: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Relation entre entites Relation bidirectionnelle

Symfony

Exercice

Ecrire un code qui permet d’inserer une adresse dans la base dedonnees appartenant a deux personnes

la premiere etant une personne qui est deja dans la base dedonnees.

la deuxieme est une nouvelle qui n’existait pas.

H & H: Research and Training 85 / 105

Page 117: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Relation entre entites Inheritance

Symfony

Deux possibilites avec l’heritage

SINGLE TABLE

JOINED

Exemple

Une classe mere Personne

Deux classes filles Etudiant et Enseignant

H & H: Research and Training 86 / 105

Page 118: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Relation entre entites Inheritance

Symfony

Deux possibilites avec l’heritage

SINGLE TABLE

JOINED

Exemple

Une classe mere Personne

Deux classes filles Etudiant et Enseignant

H & H: Research and Training 86 / 105

Page 119: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Relation entre entites Inheritance

Symfony

Demarche

On commence par creer deux entites Etudiant et Enseignant

L’entite Etudiant a un seul attribut niveau de type string (delongueur 30)

L’entite Enseignant a un seul attribut salaire de typeinteger

H & H: Research and Training 87 / 105

Page 120: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Relation entre entites Inheritance

Symfony

Pour indiquer comment transformer les classes mere et filles en tables

Il faut utiliser l’annotation @InheritanceType

Il faut aussi indiquer la solution choisie pour l’heritage

Dans la classe mere on ajoute@ORM\InheritanceType("SINGLE TABLE")

H & H: Research and Training 88 / 105

Page 121: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Relation entre entites Inheritance

Symfony

Pour indiquer comment transformer les classes mere et filles en tables

Il faut utiliser l’annotation @InheritanceType

Il faut aussi indiquer la solution choisie pour l’heritage

Dans la classe mere on ajoute@ORM\InheritanceType("SINGLE TABLE")

H & H: Research and Training 88 / 105

Page 122: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Relation entre entites Inheritance

Symfony

Exemple

Et pour distinguer etudiant, enseignant et personne

@DiscriminatorColumn(name="type", type="string")dans la classe mere,

@DiscriminatorMap({"personne" = "Personne","etudiant" = "Etudiant", "enseignant" ="Enseignant"})

Dans la table personne, on aura une colonne type qui aura commevaleur soit personne, soit etudiant soit enseignant.

H & H: Research and Training 89 / 105

Page 123: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Relation entre entites Inheritance

Symfony

Exemple

Et pour distinguer etudiant, enseignant et personne

@DiscriminatorColumn(name="type", type="string")dans la classe mere,

@DiscriminatorMap({"personne" = "Personne","etudiant" = "Etudiant", "enseignant" ="Enseignant"})

Dans la table personne, on aura une colonne type qui aura commevaleur soit personne, soit etudiant soit enseignant.

H & H: Research and Training 89 / 105

Page 124: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Relation entre entites Inheritance

SymfonyLa classe Personne

/*** @ORM\Entity(repositoryClass="App\Repository\PersonneRepository")* @ORM\InheritanceType("SINGLE_TABLE")* @ORM\DiscriminatorColumn(name="type", type="string")* @ORM\DiscriminatorMap({"personne" = "Personne", "etudiant" = "Etudiant", "enseignant" = "

Enseignant"})*/

class Personne {

// + tout le code precedent

}

La classe Etudiant

/**** @ORM\Entity(repositoryClass="App\

Repository\EtudiantRepository")*/

class Etudiant extends Personne{

// le contenu ne change pas}

La classe Enseignant

/*** @ORM\Entity(repositoryClass="App\

Repository\EnseignantRepository")*/class Enseignant extends Personne{

// le contenu ne change pas}

H & H: Research and Training 90 / 105

Page 125: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Relation entre entites Inheritance

Symfony

Pour regenerer les tables dans la base de donnees, executez

php bin/console make:migration

php bin/console doctrine:migrations:migrate

Verifier les modifications avec la console MySQL ou phpMyAdmin

H & H: Research and Training 91 / 105

Page 126: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Relation entre entites Inheritance

Symfony

Pour regenerer les tables dans la base de donnees, executez

php bin/console make:migration

php bin/console doctrine:migrations:migrate

Verifier les modifications avec la console MySQL ou phpMyAdmin

H & H: Research and Training 91 / 105

Page 127: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Relation entre entites Inheritance

SymfonyAinsi, on peut faire :

$personne = new Personne();$personne->setNom(’Wick’);$personne->setPrenom(’John’);

$etudiant = new Etudiant();$etudiant->setNom(’Maggio’);$etudiant->setPrenom(’Carol’);$etudiant->setNiveau(’master’);

$enseignant = new Enseignant();$enseignant->setNom(’Baggio’);$enseignant->setPrenom(’Roberto’);$enseignant->setSalaire(2000);

$entityManager->persist($personne);$entityManager->persist($etudiant);$entityManager->persist($enseignant);$entityManager->flush();

H & H: Research and Training 92 / 105

Page 128: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Relation entre entites Inheritance

Symfony

Allons voir la base de donnees

une seule table Personne a ete creee

cette table a les colonnes id, nom, prenom, salaire, niveau ettype

la personne Wick John a la valeur null dans salaire etniveau et la valeur personne dans type

l’etudiant Maggio Carol a la valeur null dans salaire et lavaleur etudiant dans type

l’enseignant Baggio Roberto a la valeur null dans niveau etla valeur enseignant dans type

H & H: Research and Training 93 / 105

Page 129: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Relation entre entites Inheritance

SymfonyRemplacons SINGLE TABLE par JOINED dans la classe Personne

/*** @ORM\Entity(repositoryClass="App\Repository\PersonneRepository")* @ORM\InheritanceType("JOINED")* @ORM\DiscriminatorColumn(name="type", type="string")* @ORM\DiscriminatorMap({"personne" = "Personne", "etudiant" = "Etudiant", "enseignant" = "

Enseignant"})*/

class Personne{

// + tout le code precedent

}

Pas de changement Etudiant

/**** @ORM\Entity(repositoryClass="App\

Repository\EtudiantRepository")*/

class Etudiant extends Personne{

// le contenu ne change pas}

Pas de changement Enseignant

/*** @ORM\Entity(repositoryClass="App\

Repository\EnseignantRepository")*/class Enseignant extends Personne{

// le contenu ne change pas}

H & H: Research and Training 94 / 105

Page 130: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Relation entre entites Inheritance

Symfony

Pour regenerer les tables dans la base de donnees, executez

php bin/console make:migration

php bin/console doctrine:migrations:migrate

Verifier les modifications avec la console MySQL ou phpMyAdmin

H & H: Research and Training 95 / 105

Page 131: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Relation entre entites Inheritance

Symfony

Pour regenerer les tables dans la base de donnees, executez

php bin/console make:migration

php bin/console doctrine:migrations:migrate

Verifier les modifications avec la console MySQL ou phpMyAdmin

H & H: Research and Training 95 / 105

Page 132: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Relation entre entites Inheritance

Symfony

Allons voir la base de donnees

trois tables : creees Personne, Etudiant et Enseignant

une table Personne avec les colonnes id, nom, prenom et type

une table Etudiant avec les colonnes id et niveau

une table Enseignant avec les colonnes id et salaire

H & H: Research and Training 96 / 105

Page 133: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Relation entre entites Inheritance

SymfonyAinsi, on peut faire :

$personne = new Personne();$personne->setNom(’Wick’);$personne->setPrenom(’John’);

$etudiant = new Etudiant();$etudiant->setNom(’Maggio’);$etudiant->setPrenom(’Carol’);$etudiant->setNiveau(’master’);

$enseignant = new Enseignant();$enseignant->setNom(’Baggio’);$enseignant->setPrenom(’Roberto’);$enseignant->setSalaire(2000);

$entityManager->persist($personne);$entityManager->persist($etudiant);$entityManager->persist($enseignant);$entityManager->flush();

H & H: Research and Training 97 / 105

Page 134: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Evenement et methodes callback

Symfony

Cycle de vie d’une entite

Le cycle de vie de chaque objet d’une entite passe par troisevenements principaux

creation (avec persist())

mise a jour (avec flush())

suppression (avec remove())

H & H: Research and Training 98 / 105

Page 135: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Evenement et methodes callback

Symfony

Une methode callback

Une methode callback est une methode qui sera appelee avantou apres un evenement survenu sur une entite

On utilise les annotations pour specifier quand la methodecallback sera appelee

C’est comme les triggers en SQL

H & H: Research and Training 99 / 105

Page 136: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Evenement et methodes callback

Symfony

Une methode callback

Une methode callback est une methode qui sera appelee avantou apres un evenement survenu sur une entite

On utilise les annotations pour specifier quand la methodecallback sera appelee

C’est comme les triggers en SQL

H & H: Research and Training 99 / 105

Page 137: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Evenement et methodes callback

Symfony

Les methodes callback

@PrePersist : avant qu’une nouvelle entite soit persistee.

@PostPersist : apres l’enregistrement de l’entite dans la base de donnees.

@PostLoad : apres le chargement d’une entite de la base de donnees.

@PreUpdate : avant que la modification d’une entite soit enregistree en base dedonnees.

@PostUpdate : apres que la modification d’une entite est enregistree en basede donnees.

@PreRemove : avant qu’une entite soit supprimee de la base de donnee.

@PostRemove : apres qu’une entite est supprimee de la base de donnee.

H & H: Research and Training 100 / 105

Page 138: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Evenement et methodes callback

SymfonyLa classe Personne

class Personne{.../*** @ORM\Column(name="nbrMAJ", type="integer")*/

private $nbrMAJ = 0;...public function setNbrMAJ($nbrMAJ) {

$this->nbrMAJ = $nbrMAJ;return $this;

}public function getNbrMAJ() {

return $this->nbrMAJ;}

}

On utilise l’attribut nbrMAJ pour compter le nombre de modifications d’une entite

H & H: Research and Training 101 / 105

Page 139: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Evenement et methodes callback

SymfonyLa classe Personne

class Personne{.../*** @ORM\Column(name="nbrMAJ", type="integer")*/

private $nbrMAJ = 0;...public function setNbrMAJ($nbrMAJ) {

$this->nbrMAJ = $nbrMAJ;return $this;

}public function getNbrMAJ() {

return $this->nbrMAJ;}

}

On utilise l’attribut nbrMAJ pour compter le nombre de modifications d’une entite

H & H: Research and Training 101 / 105

Page 140: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Evenement et methodes callback

Symfony

Demarche

Tout d’abord, on doit indiquer a Doctrine que notre entite utiliseune fonction callback avec l’annotationHasLifecycleCallbacks

Ensuite, on va creer une methode qui sera appelee avant chaquemodification

Cette methode doit incrementer chaque fois le nombre demise-a-jour (nbrMAJ)

H & H: Research and Training 102 / 105

Page 141: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Evenement et methodes callback

Symfony

Dans la classe Personne

/*** @ORM\Entity(repositoryClass="App\Repository\

PersonneRepository")* @ORM\HasLifecycleCallbacks()*/

class Personne{.../*** @ORM\PreUpdate*/public function updateNbrMAJ() {

$this->setNbrMAJ($this->getNbrMAJ() + 1);}...

}

H & H: Research and Training 103 / 105

Page 142: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Evenement et methodes callback

Dans le controleur

/*** @Route("/personne/event", name="personne_event")*/function event(EntityManagerInterface $entityManager){

$personne = new Personne();$personne->setNom(’Wick’);$personne->setPrenom(’John’);

$entityManager->persist($personne);$entityManager->flush();

$personne->setNom(’Travolta’);$entityManager->flush();

$personne->setNom(’Abruzzi’);$entityManager->flush();return $this->render(’personne/index.html.twig’, [

’controller_name’ => ’PersonneController’,’personne’ => $personne,’adjectif’ => $personne->getNbrMAJ()

]);}

H & H: Research and Training 104 / 105

Page 143: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Generation d’entites a partir d’une base de donnees existante

Symfony

Pour generer les entites a partir d’une base de donnees existante

executez la commande php bin/console doctrine:mapping:import"App\Entity" annotation --path=src/Entity

Remarque

Les attributs des entites generees n’ont pas de getters/setters.

Pour generer les getters/setters

executez la commande php bin/console make:entity --regenerate App

H & H: Research and Training 105 / 105

Page 144: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Generation d’entites a partir d’une base de donnees existante

Symfony

Pour generer les entites a partir d’une base de donnees existante

executez la commande php bin/console doctrine:mapping:import"App\Entity" annotation --path=src/Entity

Remarque

Les attributs des entites generees n’ont pas de getters/setters.

Pour generer les getters/setters

executez la commande php bin/console make:entity --regenerate App

H & H: Research and Training 105 / 105

Page 145: Symfony 5 : Doctrine · Symfony Doctrine? un ORM pour PHP propose en 2006 par Konsta Vesterinen (2.0 fin 2010)´ utilise par´ Symfony depuis la version 1.3 (et autres comme Zend

© Achref EL MOUELHI ©

Generation d’entites a partir d’une base de donnees existante

Symfony

Pour generer les entites a partir d’une base de donnees existante

executez la commande php bin/console doctrine:mapping:import"App\Entity" annotation --path=src/Entity

Remarque

Les attributs des entites generees n’ont pas de getters/setters.

Pour generer les getters/setters

executez la commande php bin/console make:entity --regenerate App

H & H: Research and Training 105 / 105