Dans ce tutoriel, nous allons découvrir comment stocker et afficher des données provenant d'une base de données en utilisant l'ORM Doctrine qui va nous permettre de récupérer et de modifier des informations plus facilement.
Configuration
Pour commencer on va modifier notre fichier d'environnement .env
ou .env.local
pour définir la configuration permettant de se connecter à la base de données.
DATABASE_URL="mysql://root:password@127.0.0.1:3306/main?serverVersion=8.0.31&charset=utf8mb4"
Vous pouvez vous inspirer des lignes en commentaire pour adapter à votre SGBD. Le numéro de version est important car cela permet à doctrine de générer des requêtes SQL compatibles avec votre version.
L'entité
L'ORM permet de représenter nos données sous forme d'objets qui pourront ensuite être persistés en base de données grâce à des méthodes spécifiques. Il se chargera de générer les requêtes SQL et de s'adapter au système de gestion de base de données utilisé.
Pour commencer on créera une entité à l'aide de la commande make:entity
.
php bin/console make:entity Recipe
Cette commande va vous poser des questions pour définir les champs dont vous avez besoin. Une fois terminée cette commande va générer 2 fichiers :
- Une entité, qui est un objet PHP classique qui va représenter les données. Cet objet possède des attributs PHP qui permettent à Doctrine de comprendre comment sont sauvegardées les données dans la base de données.
- Un repository, qui permet de récupérer les enregistrements en utilisant des requêtes SQL.
Migrations
Une fois que l'on a créé nos entités, il va falloir créer les tables associées dans notre base de données. Pour cela on peut utiliser la commande make:migration
.
php bin/console make:migration
Cette commande va comparer la structure actuelle de la base de données avec la structure attendue. Il génèrera un fichier de migration qui contiendra les requêtes SQL à effectuer pour changer la structure de la base de données pour correspondre au code de notre application.
Utilisation
Maintenant que notre entité et notre table sont créées on va pouvoir utiliser l'ORM pour récupérer et modifier nos données.
Récupération
Pour interroger notre base de données et récupérer les données on utilisera le repository que l'on peut injecter en paramètre de notre controller.
public function index(RecipeRepository $repository): Response
{
$recipes = $repository->findAll();
return $this->render('recipe/index.html.twig', [
'recipes' => $recipes,
]);
}
Cela nous donne un tableau d'éléments mais on peut aussi récupérer un enregistrement spécifique avec des méthodes comme find()
ou findOneBy()
.
On peut aussi créer des méthodes personnalisées dans notre repository.
Création
Pour créer une nouvelle ressource il suffit d'instancier l'entité, d'utiliser la méthodepersist()
du manager d'entité pour l'enregistrer, et enfin d'utiliser la méthode flush()
pour porter les modifications au niveau de la base de données.
public function index(EntityManagerInterface $em): Response
{
$recipes = (new Recipe())
->setTitle('Mon titre');
$em->persist($recipe);
$em->flush(); // Génère une transaction SQL qui fera l'insertion
// ...
}
Edition
Pour mettre à jour une entité il suffit de modifier ses propriétés puis d'utiliser la méthode flush()
pour enregistrer les modifications dans la base de données.
public function edit(EntityManagerInterface $em): Response
{
// $recipe représente une entité provenant de la base de données
$recipe->setTitle('Mon titre');
$em->flush(); // Génère une transaction SQL qui fera l'UPDATE
// ...
}
Suppression
Pour supprimer une entité on utilisera la méthode remove()
puis, comme à chaque fois, flush()
public function remove(EntityManagerInterface $em): Response
{
// $recipe représente une entité provenant de la base de données
$em->remove($recipe);
$em->flush(); // Génère une transaction SQL qui fera un DELETE
// ...
}