Formation PUB030 : Laravel, 2019 Insertion des données initiales

13.1 Les fichiers de seeds pour insérer les données initiales dans la BD


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.

▼Publicité Le texte se poursuit plus bas

Données initiales vs données de test

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.

Générer le fichier de seeds

Un fichier de seeds sera créé à l’aide de la commande :

Console Vagrant SSH

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 :

Fichier de seeds (PHP)

<?php

 

use IlluminateDatabaseSeeder;

 

class CategoriesTableSeeder extends Seeder

{

    /**

     * Run the database seeds.

     *

     * @return void

     */

    public function run()

    {

        //

    }

}

Éditer le fichier de seeds

Éditez ce fichier pour y ajouter les données désirées à l'aide de DB::table().

Fichier de seeds (PHP)

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',

        ],

    ]);

}

Clés primaires

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.

Entrer une date dans un fichier de seeds

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 :

Fichier de seeds (PHP)

'naissance' => '1999-08-31',

Pour un champ de type datetime, on fera suivre par l'heure au format 'hh:mm:ss'.

Ex :

Fichier de seeds (PHP)

'rendezvous' => '2018-02-16 13:27:00',

Champs nullable

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 :

PHP

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',

    ],

]);

Exécuter tous les fichiers de seeds du fichier DatabaseSeeder.php

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.

Fichier DatabaseSeeder.php (PHP)

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 :

Console Vagrant SSH

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.

Champs created_at et updated_at

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.

Approche des fichiers de migration vs approche des fichiers de seeds

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.

  • À chaque fois que vous exécutez des fichiers de migration, Laravel maintient dans la table migrations la liste des fichiers qui ont déjà été 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.

  • Pour les fichiers de seeds, c'est au développeur de maintenir la liste des fichiers à exécuter. Ceci sera fait dans le fichier DatabaseSeeder.php.

    Lorsque vous lancez la commande php artisan db:seed, Laravel exécute tous les fichiers de seeds présents dans ce fichier.

Exécuter un seul fichier de seeds

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 :

Console Vagrant SSH

php artisan db:seed --class=MaTableTableSeeder

Réinitialiser toutes les données

Il est possible de supprimer toutes les tables puis de réexécuter les fichiers de migration et de seeds comme suit :

Console Vagrant SSH

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.

Pour plus d'information

« 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

Veuillez noter que le contenu de cette fiche vous est partagé à titre gracieux, au meilleur de mes connaissances et sans aucune garantie.
Par Christiane Lagacé
Dernière révision le 7 février 2019
Merci de partager !

Site fièrement hébergé chez A2 Hosting.

Soumettre