如何在 Laravel 中使用 Database Seeders 轻松生成数据

WBOY
发布: 2024-07-26 04:48:43
原创
393 人浏览过

How to easily generate data with Database Seeders in Laravel

构建应用程序时,无论是小型、中型还是大型。在应用程序中使用测试数据是不可避免且重要的。

因此,让我们从简单到高级,从两个不同的场景开始。

我。所有应用程序或大多数应用程序都应该有用户。有时,我们希望将用户分类/标记为管理员或常规用户。因此,让我们生成一个包含 100 个用户的简单播种器,其表规格如下:

  • ID、名字、姓氏、电子邮件、密码
  • 用户类型:管理员或常规用户

我们开始吧。

为了植入 users 表,当然,您需要 Laravel 为您创建默认的用户迁移表。

因此,为了演示,您的表迁移应如下所示:

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();
        });
    }
登录后复制

为我们的用户表创建一个播种器类。

php artisan make:seeder UserSeeder
登录后复制

因此,要为我们刚刚创建的播种器创建值,我们需要使用每个 Laravel 应用程序附带的默认 Faker 包。

为了一次生成 100 个用户,我们首先执行一个 for 循环并将假/伪数据传递到每一列,如下所示:

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'])
      ]);
   }
}
登录后复制

要将其播种到数据库中,我们需要运行以下命令:

php artisan db:seed --class=UserSeeder
登录后复制

这将创建 100 个用户并将其插入数据库。

就这么简单

现在,我们需要一个更高级的解决方案。

我们需要创建:

  • 包含 10 个新部门的部门表。
  • 我们将创建 100 个新用户。
  • 员工表将引用用户表,具有相同的详细信息和一个额外的列来引用部门表,即department_id。

我们已经知道用户表是什么样子,让我们看看员工表和部门表是什么样子。

员工桌

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();
        });
登录后复制

部门表:

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

因此我们需要运行迁移才能将这些表保留在我们的数据库中。

现在,对于 UserSeeder 类,我们将实现前面所述的要点。

  • 包含 10 个新部门的部门表。
$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++;
        }
登录后复制

最后两个要点需要一起实现

  • 我们将创建新的 100 个用户
  • 员工表将引用用户表,具有相同的详细信息和一个额外的列来引用部门表,即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
                ]);
            }
}
登录后复制

说明:

  • 我们先创建了10个部门。

  • 然后我们设置一个计数器来检查是否所有 10 个部门都已创建。

  • 如果计数器条件为真,我们将创建 100 个用户。

  • 对于这 100 个用户中的每一个,我们需要在另一个名为员工表的表中引用他们的详细信息。

  • 每个员工必须属于一个用户,也必须属于一个部门,所以为此,我们需要获取之前创建的所有部门,并将它们随机注入到department_id列中。

完整的 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
                ]);
            }
        }
登录后复制

然后运行:

php artisan make:seeder --class=UserSeeder
登录后复制

如果您有任何疑问,请随时提出。快乐编码!

以上是如何在 Laravel 中使用 Database Seeders 轻松生成数据的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板