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

WBOY
Libérer: 2024-07-26 04:48:43
original
284 Les gens l'ont consulté

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();
        });
    }
Copier après la connexion

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

php artisan make:seeder UserSeeder
Copier après la connexion

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'])
      ]);
   }
}
Copier après la connexion

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

php artisan db:seed --class=UserSeeder
Copier après la connexion

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();
        });
Copier après la connexion

Tableau des départements :

Schema::create('departments', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->timestamps();
        });
Copier après la connexion

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++;
        }
Copier après la connexion

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
                ]);
            }
}
Copier après la connexion

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
                ]);
            }
        }
Copier après la connexion

Puis exécutez :

php artisan make:seeder --class=UserSeeder
Copier après la connexion

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!

source:dev.to
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!