Maison > Article > développement back-end > Comment générer facilement des données avec Database Seeders dans 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 :
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 :
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.
$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
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!