formations / symfony / base-de-donnees-entites
Base de données & entités
Nous allons apprendre à configurer et créer une base de données avec l'ORM Doctrine de Symfony. Ensuite conformément à un petit MCD (Modèle Conceptuel de Données), nous allons pouvoir créer des tables dans la base de données et gérer leurs relations. Mais redéfinissons quelques principes.
Modèle Conceptuel de Données (MCD)
Le MCD, Modèle Conceptuel de Données est une représentation de l'organisation des données du sujet traité. Le MCD est une étape préalable importante dans la mise en oeuvre de tout projet, notamment une application Web.
On retrouve un article sur le Modèle de données sur Wikipédia ici.
Comme c'est indiqué dans l'article, un MCD permet de définir comment les données sont organisées mais également de valider leur intégrité notamment lors de la mise en place de relations.
Un MCD permet normalement la validation à travers la génération d'un MLD (Modèle Logique de Données) et d'un MPD (Modèle Physique des Données), ce qui est dans le cas d'un projet Symfony un étape optionnelle, le MCD sera recréé dans Symfony avec Doctrine comme nous allons le voir dans ce tutoriel.
Exemple de MCD
Dans l'exemple construit rapidement avec LucidChart, on distingue trois entités.
- Categorie : Entité composée de quatre propriétés
id (int not null auto-increment),
nom (varchar 255 not null),
description (texte nullable),
produits (une relation vers l'entité et donc la table des Produit). Une Categorie peut contenir plusieurs Produit, il s'agit d'une relation OneToMany (One Categorie To Many Produit). - Produit : Entité composée également de quatre propriétés
id (int not null auto-increment),
nom (varchar 255 not null),
description (texte nullable),
images (une relation vers l'entité et donc la table des Image). Un Produit peut contenir plusieurs Images, il s'agit la encore dans le sens descendant, d'une relation OneToMany (One Produit To Many Image). - Image : Entité composées de trois propriétés
id (int not null auto-increment),
imageName (varchar 255 not null) et
updatedAt (DatetimeImmutable nullable)
Nous reviendrons ultérieurement sur les concepts de relation que sont OneToMany, ManyToOne, ManyToMany, OneToOne.
Mapping Object Relationel (ORM)
Encore une fois c'est Wikipédia qui répondra au mieux, mais, sinon, quoi dire ?
Un ORM est une couche logicielle permettant à l'application d'effectuer des transactions avec la base de données. chose appréciable, ces transactions sont effectuées en mode Objet.
Avec Symfony c'est l'ORM Doctrine qui a été retenu. Le principe est simple on ne manipule que des objets.
Création de la base de données
La configuration de la base de données est déclarée dans le fichier .env, par défaut, cette configuration est déclarée pour PostGré SQL, nous allons faire une configuration pour notre environnement et du coup MySql
On commente la ligne relative à la déclaration de base de données Postgré et on décommente la ligne pour MySql. Il reste alors à changer la configuration d'après les indications :
- app:!changeme! : Il s'agit de la déclaraion du user et de password pour l'accès à la base de données. Sur Windows avec un environnement Xampp ou en encore Wamp on remplacera la totalité de la chaîne pour root. On ne gardera pas les : qui à l'origine servent de séparateur entre le login et le password (login:password).
- app : Il s'agit du nom de la base de données (à nommer avec des underscores - souligné du 8).
- ?serverVersion : Cette option permet de déclarer le type et la version du serveur. Dans le cas d'un serveur Msql on se contente de déclarer le numéro de version, comme ici serverVersion=8. Dans le cas d'un serveur MariaBD ou noterait comme suit : serverVersion=mariabd-10.x.x
Il ne reste plus maintenant à s'assurer que l'émulateur de serveur est lancé et de procéder à la commande suivante dans le terminal.
php bin/console doctrine:database:create
La base de données est maintenant créée, on peut toujours vérifier dans PhpMyAdmin si on a le moindre doute... à vous de voir
Créer des entités
Maintenant que la base de données est crée, on peut mettre en place les tables et donc mettre en place dans le projet les entités (Le Modèle de Données dans le Design Pattern MVC).
Pour faire la première, on lance la commande suivante dans le terminal :
php bin/console make:entity
Ensuite, il n'y a plus qu'à se laisser guider par le terminal en répondant à différentes questions.
La première réside dans le fait de donner le nom au Modèle que l'on souhaite créer. Dans cet exemple, nous allons créer la première entité de notre petit MCD. Nous allons donc rensiegner le nom Categorie
Les nom de l'entité est un nom de classe, donc on respecte les bons usages, on le renseigne en commençant par une majuscule, le camel case et bienvenue ensuite et bien sûr pas d'accents, d'espaces ou de caractères spéciaux
Lorsqu'on valide le nom de classe de l'entité, deux fichiers sont créés, l'entité dans le dossier "src/Entity" et la repository dans "src/Repository". Dans le contexte du MVC Symfony, alors l'entité représente le modèle de données, c'est à dire la structure de la table. L'intégralité des requêtes devant être effectuées dans la repository. Cette séparation "structure", "requêtes" s'avère être très confortable est lisible.
Une série de questions nous est alors posée afin de renseigner le nom de la propriété mais aussi son type et le fait qu'elle puisse être "nullable" comme illustré ci-dessous avec la propriété nom de l'entité Categorie de notre MCD :
Nous déclarons la proprété "nom" de l'entité "Categorie" en tant que string qui sera varchar dans la base de données. Cette chaîne sera d'une longueur maximale de 255 caractères et ne devra pas être nulle.
On procède de la même façon pour la description. Il est à noter que si l'on a un doute sur le type de la données, il est possible de faire ? afin de découvrir tous les types disponibles.
Dans l'exemple ci-dessus à l'aide du choix ? on a affiché tous les types de données affectable dans l'entité (la capture n'en révèle qu'une partie). On peut distinguer :
Main Types : Ce type correspond au types courament utilisés.
RelationShip : Les différents types de relations pouvant êtres mis en place, bien sûr les quatres (OneToOne, OneToMany, ManyToOne et ManyToMany) Il est important qu'en cas de doute, il est possible avec "relation" d'accéder à un "wizzard" d'aide nous permettant de faire plus facilement de faire notre choix, mais nous aurons l'occasion de reparler de cela.
Array/Object : Les différents types comme les tableaux, les object jSon etc.
Date/Time : Tout ce qui est dates, datetime, datetime_immutable, etc.
Other : D'autres types comme de l'ascii
Lorsqu'on a fini d'énumérer les propriétés de l'entité, leurs types, et leurs status (nullable ou non) et à l'exception des propriétés de relation comme "produits" dans le cas de l'entité Categorie, on est inviter à effectuer deux commandes successives
Comme le montre la capture, la création de l'entité et l'ajout des propriétés finis avec succés, on est inviter à faire la première des deux commandes.
php bin/console make:migration
Lorsque cette première commande a été effectuée, un script php de migration est créé dans le dossier "migrations" de l'application. Ce fichier contient la ou les requêtes sql permettant de mettre à jour la base de données (les tables) d'après le(s) modèle(s). Le second script va executer ce script.
php bin/console doctrine:migrations:migrate
Lorsqu'on lance la commande, on est averti par un warning que l'opération que l'on s'apprête à lancer peut avoir un impact sur la base de données; voire les données elles-mêmes.
Bien sûr, on valide...
Voilà, nous avons créé une entité et nous avons conformé la base de données au modèle de sorte qu'elle contient maintenant une table nommé categorie. Vous pouvez cloner le GIT ci-dessous pour tester. Attention à mettre en place à l'aide du fichier README.md
Et bien voila, nous avons une base de données et une table, pourquoi ne pas allez plus loin en ajoutant d'autres tables et les relations prévues dans le MCD de ce tuto.
Tutos du jour
MySql - Tables & relations
Dans une base de données relationnelle, les données sont stockées dans des tables qui sont liées entre elles par des relations.
Voir le tutoMySql - Requête INSERT INTO
La requête INSERT INTO permet d'ajouter de nouvelles lignes dans une table existante.
Voir le tuto