Vous êtes sur la page 1sur 22

Symfony

Doctrine

https://symfony.com/doc/current/doctrine.html
Doctrine

1. Mapping ORM
2. Installation et configuration Doctrine
3. Création de tables
4. Relations et associations
5. Lecture et écriture en base de donnée
6. Mise à jour et suppression
7. Requêtes dynamiques avec Query Builder
Mapping ORM
object-relational mapping

mapping objet-relationnel

Objet

https://www.doctrine-project.org
Mapping ORM
Transforme notre modèle en SQL

<?php
/** @Entity */
class Message
{
/** @Column(type="integer") */
private $id;
/** @Column(length=140) */
private $text;
/** @Column(type="datetime", name="posted_at") */
private $postedAt;
}
Installation et configuration
composer require symfony/orm-pack

Installation des composants de l’ORM (Doctrine, dépendances …)

composer require --dev symfony/maker-bundle

Installation de commandes additionnelles nous permettant de


gagner du temps pour créer notre model
###> doctrine/doctrine-bundle ###
# Format described at http://docs.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/configuration.html#connecting-using-a-
# For an SQLite database, use:
url
# Configure your db driver and server_version in
"sqlite:///%kernel.project_dir%/var/data.db"
DATABASE_URL=mysql://root:@127.0.0.1:3306/forum
config/packages/doctrine.yaml
###< doctrine/doctrine-bundle ###

Configuration de notre BDD dans le fichier .env

php bin/console doctrine:database:create


Created database `forum` for connection named default

Création de la base de donnée avec


doctrine
Création de tables

Utilisation de maker bundle pour créer une entité (classe article)


php bin/console make:entity
Mise à jour de la BDD

Le fichier Article.php à été créé automatiquement

Il contient le mapping de model et la classe Article

php bin/console doctrine:schema:update --force


Lecture et écriture en base de
données
Ecriture en base de donnée

1) Création d’un contrôler pour nos articles

php bin/console make:controller Article

http://127.0.0.1:8000/article
Lecture et écriture en base de
données
Nous allons maintenant écrire dans notre base de données avant
d’afficher notre page
$entityManager = $this->getDoctrine()->getManager();

$article = new Article();


$article->setTitre('Premier Article');
$article->setContenu('Bienvenue dans notre premier article');

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

return $this->render('article/index.html.twig', [
'article' => $article,
]);

SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'category_id' cannot be null

/**
* @ORM\ManyToOne(targetEntity="App\Entity\Category", inversedBy="article")
* @ORM\JoinColumn(nullable=false)
*/
private $category;
A vous

Répétez les étapes précédentes pour créer un controlleur Category

Insérer une catégorie en base de donnée

Dans la vue catégory afficher l’image et le nom de la category


Lecture en base de donnée

$category = $this->getDoctrine()
->getRepository(Category::class)
->find($id);

1) On reccupere notre repository

2) On appel la méthode find présente par défaut (étendue de la classe EntityManager)

Il existe d’autres méthodes dans la classe EntityManager


- findAll()
- findBy([])
- findOneBy([])
A vous :

• Reccupérer la catégorie insérer afin de créer un article

• Créer une page qui liste tous les articles

• Créer une page qui liste toutes les catégories et les


articles qui lui sont liés

• Créer une page qui affiche les articles

• Ajoutez des liens pour naviguer entre ces pages (cf : cours twig)
Lecture en BDD automatique

composer require sensio/framework-extra-bundle

Avant Après

/**
* @Route("/category/{id}", name="category_show")
*/
public function show($id)
{
$category = $this->getDoctrine()
->getRepository(Category::class) /**
->find($id); * @Route("/category/{category}", name="category_show")
*/
public function show(Category $category)
{
if (!$category) {
return $this->render('category/index.html.twig', [
throw $this->createNotFoundException( 'category' => $category,
'No category found for id '.$id ]);
);
} }

return $this->render('category/index.html.twig', [
'category' => $category,
]);

Equivalent et plus lisible !!!


Relations et associations
/**
* @ORM\ManyToOne(targetEntity="App\Entity\Category",
inversedBy="article")
* @ORM\JoinColumn(nullable=false)
*/
private $category;

/**
* @ORM\OneToMany(targetEntity="App\Entity\Article",
mappedBy="category")
*/
private $article;

Utilisez relation comme type avec la commande make:entity


Mise à jour d’un objet en BDD

1) Récupérer notre objet (de manière automatique ou manuelle)

2) On change les attributs à modifier

3) On appel la méthode flush de notre entity manager

/**
* @Route("/article/{article}/update",
name="article_update")
*/
public function update(Article $article)
{
$article->setTitre('Mon titre mis a jour');
$this->getDoctrine()->getManager()-
>flush();
Suppression d’un objet en BDD

1) Récupérer notre objet (de manière automatique ou manuelle)

2) On appel la méthode remove de l’Entity Manager

3) On appel la méthode flush de l’Entity Manager

/**
* @Route("/article/{article}/delete",
name="article_delete")
*/
public function delete(Article $article){
$entityManager = $this->getDoctrine()-
>getManager();
$entityManager-
>remove($article);
$entityManager->flush();
Requêtes dynamiques avec
QueryBuilder
Permet de faire des requêtes plus complexes en utilisant notre repository

Utilisation de l’API du Query Builder (nous étudierons cette méthode)

Mais aussi pour aller plus loin:


Possibilité d’utiliser le langage DQL, (Doctrine Query Language)

Possibilité d’utiliser du SQL, (Structured Query Language)


Exemple :
Exemple 1 : On affiche le nombre de catégorie présente dans notre BDD

public function countAll()


{
return $this->createQueryBuilder('art')
->select('COUNT(art) as nbArticle') ArticleRepository.php
->getQuery()
->getFirstResult();
}

$nbArticle = $articleRepository- ArticleController.php


>countAll();

{% block body %}
{{ nbArticle['nbArticle'] }} articles sur notre forum
{% endblock %}
index.html.twig
Exemple :
Exemple 2: On affiche les articles ayant un mot envoyé en paramètre dans leur titre

public function search($string){


return $this-
>createQueryBuilder('article')
->where('article.titre LIKE
:string')
->setParameter(':string', '%'.$string.'%')
->getQuery() ArticleRepository.php
-
} >getResult();

/**
* @Route("/article/search/{string}",
name="article_delete")
*/
public function search($string){
$articleRepository = $this->getDoctrine()-
>getRepository(Article::class);
$articles = $articleRepository- ArticleController.php
>search($string);
return $this->render('article/search.html.twig',
[ 'articles' => $articles
]);
}
Exemple :
Exemple 2: On affiche les articles ayant un mot envoyé en paramètre dans leur titre

{% extends 'base.html.twig' %}
search.html.twig
{% block title %}Search ArticleController!{% endblock %}

{% block body %}
{% for art in articles %}
{{ art.titre }} <br>
{% endfor %}
{% endblock %}
A vous

- Créez une les fonctions d’ajout, de suppression et de modification pour les


catégories

- Ajoutez sur les pages catégories et articles un lien pour supprimer les
articles et les catégories

Attention : Vous ne pouvez pas supprimer une catégorie contenant des articles

Trouvez dans la documentation doctrine et / ou Symfony les différentes


manière de le supprimer quand même
A vous :

Mettre en place une pagination pour afficher les articles par 5

1) Compter le nombre d’articles présent en base pour définir le nombre de pages

2) Envoyez en paramètre à votre contrôleur le numéro de la page à afficher

3) Afficher au maximum 5 articles par page

4) Mettre un lien pour naviguer entre chaque page

Vous aimerez peut-être aussi