Maison  >  Article  >  développement back-end  >  Comment générer facilement des données avec Database Seeders dans Laravel

Comment générer facilement des données avec Database Seeders dans Laravel

WBOY
WBOYoriginal
2024-07-26 04:48:43376parcourir

How to easily generate data with Database Seeders in Laravel

Lors de la création d'une application, qu'elle soit petite, moyenne ou grande. Avoir des données de test avec lesquelles jouer dans une application est inévitable et important.

Commençons donc du simple au avancé avec deux scénarios différents.

je. Toutes les applications ou la majorité des applications doivent avoir des utilisateurs. Parfois, nous souhaitons classer/étiqueter les utilisateurs comme Administrateur ou Utilisateurs réguliers. Générons donc un simple seeder avec 100 utilisateurs avec les spécifications du tableau ci-dessous :

  • Identifiant, Prénom, Nom, Email, Mot de passe
  • Type d'utilisateur : soit un administrateur, soit un utilisateur régulier

Alors c'est parti.

Pour insérer la table utilisateurs, bien sûr, vous auriez la table de migration des utilisateurs par défaut créée pour vous par Laravel.

Donc, pour les besoins de cette démonstration, votre migration de table devrait ressembler à ceci :

public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->id();
            $table->string('first_name');
            $table->string('last_name');
            $table->string('email');
            $table->string('password');
            $table->enum('user_type', ['user','admin'])->default('user');
            $table->rememberToken();
            $table->timestamps();
        });
    }

Pour créer une classe seeder pour notre table des utilisateurs.

php artisan make:seeder UserSeeder

Donc, pour créer des valeurs pour le seeder que nous venons de créer, nous devons utiliser le package Faker par défaut fourni avec chaque application Laravel.

Pour générer 100 utilisateurs à la fois, nous faisons d'abord une boucle for et transmettons les fausses/pseudo données dans chaque colonne comme ceci :

use Faker\Factory as Faker;

public function run()
{
   $faker = Faker::create();

   for(i = 0; i <= 99; i++)
   {
      User::create([
        'first_name' => $faker->firstName(),
        'last_name' => $faker->lastName(),
        'email' => $faker->email(),
        'password' => bcrypt('hello1234'), // we might want to set this to a value we can easily remember for testing sake
        'user_type' => $faker->randomElement(['admin', 'user'])
      ]);
   }
}

Pour insérer cela dans la base de données, nous devons exécuter la commande ci-dessous :

php artisan db:seed --class=UserSeeder

Cela créera 100 utilisateurs et les insérera dans la base de données.

C'est aussi simple que ça.

Alors maintenant, vers une solution plus avancée.

Nous devons créer :

  • Une table des départements avec 10 nouveaux départements.
  • Nous allons créer 100 nouveaux utilisateurs.
  • Une table du personnel qui fera référence à la table des utilisateurs avec les mêmes détails et une colonne supplémentaire pour référencer la table des départements c'est-à-dire Department_id.

Nous savons déjà à quoi ressemblera la table des utilisateurs, regardons à quoi ressembleront les tables du personnel et des départements.

Tableau du personnel

Schema::create('staff', function (Blueprint $table) {
            $table->id();
            $table->string('first_name');
            $table->string('last_name');
            $table->string('email');
            $table->foreignId('department_id')->references('id')->on('departments');
            $table->foreignId('user_id')->references('id')->on('users');
            $table->timestamps();
        });

Tableau des départements :

Schema::create('departments', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->timestamps();
        });

Nous devons donc exécuter une migration pour avoir ces tables dans notre base de données.

Maintenant, pour la classe UserSeeder, nous devons implémenter les puces indiquées précédemment.

  • Une table des départements avec 10 nouveaux départements.
$now = now();
        $count = 0;
        $departmentNames = ['Electronics', 'Home & Garden', 'Toys & Games', 'Health & Beauty', 'Automotive', 'Sports & Outdoors','Clothing & Accessories',
            'Books', 'Music', 'Movies & TV', 'Grocery'
        ];

        for ($j=0; $j <= 9; $j++){
            Department::create([
                'name' => $departmentNames[$j],
                'created_at' => $now,
                'updated_at' => $now,
            ]);
            $count++;
        }

Les deux derniers points devront être mis en œuvre ensemble

  • Nous allons créer 100 nouveaux utilisateurs
  • Une table du personnel qui fera référence à la table des utilisateurs avec les mêmes détails et une colonne supplémentaire pour référencer la table des départements c'est-à-dire Department_id.
if ($count == 10) { // we need to make sure we have all 10 departments
            $departments = Department::pluck('id')->toArray();

            for ($i=0; $i <= 99; $i++) {
                $user = User::create([
                    'first_name' => $faker->firstName(),
                    'last_name' => $faker->lastName(),
                    'email' => $faker->email(),
                    'password' => bcrypt('hello1234'),
                    'user_type' => $faker->randomElement(['admin', 'user']),
                    'created_at' => $now,
                    'updated_at' => $now
                ]);

                Staff::create([
                    'first_name' => $user->first_name,
                    'last_name' => $user->last_name,
                    'email' => $user->email,
                    'user_id' => $user->id,
                    'department_id' => $faker->randomElement($departments), // pick random departments from DB
                    'created_at' => $now,
                    'updated_at' => $now
                ]);
            }
}

Explication :

  • Nous avons d'abord créé 10 départements.

  • Ensuite nous mettons en place un compteur pour vérifier si les 10 départements ont été créés.

  • Si la condition du compteur est vraie, nous créons alors 100 utilisateurs.

  • Pour chacun de ces 100 utilisateurs, nous devons référencer leurs coordonnées dans un autre tableau appelé staffs table.

  • Chaque personnel doit appartenir à un utilisateur et doit également appartenir à un département, donc pour ce faire, nous devons récupérer tous les départements que nous avons créés précédemment et les injecter aléatoirement dans la colonne Department_id.

L'implémentation complète de UserSeeder

        $now = now();
        $count = 0;
        $departmentNames = ['Electronics', 'Home & Garden', 'Toys & Games', 'Health & Beauty', 'Automotive', 'Sports & Outdoors','Clothing & Accessories',
            'Books', 'Music', 'Movies & TV', 'Grocery'
        ];

        for ($j=0; $j <= 9; $j++){
            Department::create([
                'name' => $departmentNames[$j],
                'created_at' => $now,
                'updated_at' => $now,
            ]);
            $count++;
        }

        $faker = Faker::create();
        if ($count == 10) {
            $departments = Department::pluck('id')->toArray();

            for ($i=0; $i <= 99; $i++) {
                $user = User::create([
                    'first_name' => $faker->firstName(),
                    'last_name' => $faker->lastName(),
                    'email' => $faker->email(),
                    'password' => bcrypt('hello1234'),
                    'user_type' => $faker->randomElement(['admin', 'user']),
                    'created_at' => $now,
                    'updated_at' => $now
                ]);

                Staff::create([
                    'first_name' => $user->first_name,
                    'last_name' => $user->last_name,
                    'email' => $user->email,
                    'user_id' => $user->id,
                    'department_id' => $faker->randomElement($departments), // pick random departments from DB
                    'created_at' => $now,
                    'updated_at' => $now
                ]);
            }
        }

Puis exécutez :

php artisan make:seeder --class=UserSeeder

Si vous avez des questions, n'hésitez pas à laisser tomber. Bon codage !

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Article précédent:Cours abstraits en POOArticle suivant:Cours abstraits en POO