Il est possible d’ajouter des données initiales, aussi appelées données de base, ainsi que des données de test dans les tables à l’aide de fichiers de « seeds ».
Pour faciliter votre travail, prenez soin de créer un fichier de seeds pour chaque table. Si vous insérez des données dans plusieurs tables dans un même fichier de seeds, vous aurez moins de contrôle sur le processus d'insertion de données.
Quelle est la différence entre les données initiales et les données de test ? Les données initiales seront livrées avec le site Web. Il s'agit de données qui existeront peu importe à qui le site est vendu (ex : données pour remplir une table de villes, de couleurs, etc.).
Les données de test, quant à elle, ne seront pas livrées avec le site Web. Il s'agit de données fictives dont le but est de permettre de bien tester le site Web (ex : clients, produits, etc.).
Important : tout comme pour les fichiers de migration, il est important de maintenir à jour les données initiales dans vos fichiers de seeds car c'est à partir des fichiers de seeds que la base de données pourra être recréée le plus facilement.
Un fichier de seeds sera créé à l’aide de la commande :
php artisan make:seeder CategoriesTableSeeder
Le fichier ainsi généré sera placé dans le dossier database\seeds, sous le dossier du projet, et contiendra le code suivant :
<?php
use IlluminateDatabaseSeeder;
class CategoriesTableSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
//
}
}
Éditez ce fichier pour y ajouter les données désirées à l'aide de DB::table().
public function run()
{
DB::table('categories')->insert([
[
'id' => 1,
'description' => 'Plantes annuelles',
],
[
'id' => 2,
'description' => 'Plantes vivaces',
],
[
'id' => 3,
'description' => 'Arbustes',
],
[
'id' => 4,
'description' => 'Arbres',
],
[
'id' => 5,
'description' => 'Potager',
],
]);
}
Pour les clés primaires, vous avez le choix de forcer une valeur ou de laisser le SGBD utiliser la prochaine valeur disponible.
Il est suggéré de forcer la valeur des clés primaires lorsque le fichier de seeds est utilisé pour ajouter des données initiales. Ceci facilitera la gestion des clés étrangères.
Il sera possible, si désiré, de laisser le SGBD utiliser la prochaine valeur disponible lorsque le fichier de seeds est utilisé pour ajouter des données de test.
Pour entrer une date dans un champ de type date, il suffit d'entrer la date désirée au format 'aaaa-mm-jj'.
Ex :
'naissance' => '1999-08-31',
Pour un champ de type datetime, on fera suivre par l'heure au format 'hh:mm:ss'.
Ex :
'rendezvous' => '2018-02-16 13:27:00',
Si votre table contient des champs qui peuvent être nuls, vous pouvez simplement les ignorer dans le fichier de seeds. Ils prendront automatiquement la valeur nul.
Cependant, si certains enregistrements ont besoin d'avoir une valeur pour ce champ, il faudra lister le champ pour chacun des enregistrements et lui donner la valeur nul lorsque requis.
Ex :
DB::table('commentaires')->insert([
[
'id' => 1,
'prenom' => 'Christiane',
'nomfamille' => 'Lagacé',
'courriel' => 'moncourriel@gmail.com',
'siteweb' => 'http://christianelagace.com',
'url' => '/',
'commentaire' => 'Bravo pour votre site !',
'created_at' => '2018-01-11 10:16:32',
],
[
'id' => 2,
'prenom' => 'Toto',
'nomfamille' => 'Lacasse',
'courriel' => 'toto@gmail.com',
'siteweb' => NULL,
'url' => 'contact',
'commentaire' => 'J\'essaie de vous rejoindre sans succès…',
'created_at' => '2018-01-28 22:34:05',
],
]);
Pour qu'un fichier de seeds soit exécuté, on y ajoutera une référence dans le fichier database\seeds\DatabaseSeeder.php. Ce fichier contiendra la liste des fichiers de seeds à exécuter en lot.
Attention : lorsqu'une table contient une clé étrangère, ses données initiales doivent être ajoutées après celles de la table contenant la clé primaire de la relation.
Il peut être intéressant de séparer les données initiales, qui devront être livrées avec l'application, des données de test.
public function run()
{
// données initiales
$this->call(PaysTableSeeder::class);
$this->call(ProvincesTableSeeder::class);
$this->call(VillesTableSeeder::class);
// données de test
$this->call(CategoriesTableSeeder::class);
$this->call(ProduitsTableSeeder::class);
}
Ce fichier sera exécuté par la commande suivante :
php artisan db:seed
Si une table contenait déjà des données, le fichier de seeds ajoutera les nouvelles données à la suite des données existantes.
Si vous exécutez cette commande plus d'une fois, les données seront dédoublées.
Dans le cas où les clés primaires sont codées en dur, vous obtiendrez plutôt un message d'erreur.
Lorsque vous exécutez les fichiers de seeds, vous constaterez que les champs created_at et updated_at sont à nul, à moins que vous leur ayez spécifiquement donné une valeur. Ceci est normal.
Les dates d'ajout et de modification seront enregistrées automatiquement par Laravel lors de requêtes faites par programmation avec Eloquent ORM.
La façon dont Laravel détermine quels fichiers de migration doivent être exécutés est bien différente de celle qu'il utilise pour déterminer quels fichiers de seeds doivent être exécutés.
Lorsque vous lancez à nouveau la commande php artisan migrate, Laravel exécute tous les fichiers de migration dont le nom ne figure pas dans cette table.
Lorsque vous lancez la commande php artisan db:seed, Laravel exécute tous les fichiers de seeds présents dans ce fichier.
En cours de développement, il peut arriver que vous ayez besoin d'exécuter un seul fichier de seeds. La commande artisan a prévu une option à cet effet :
php artisan db:seed --class=MaTableTableSeeder
Il est possible de supprimer toutes les tables puis de réexécuter les fichiers de migration et de seeds comme suit :
php artisan migrate:refresh --seed
Après avoir exécuté cette commande, vous aurez une base de données toute neuve !
Si vous prenez le soin de bien maintenir vos fichiers de migration, vos fichiers de seeds et le fichier DatabaseSeeder.php, vous pourrez en tout temps réinitialiser votre base de données à l'aide de cette commande.
« Database: Seeding ». Laravel. https://laravel.com/docs/master/seeding
« Laravel 5 - Example of Database Seeder with insert sample data ». IT Solution Stuff. http://itsolutionstuff.com/post/laravel-5-example-of-database-seeder-with-insert-sample-dataexample.html
▼Publicité