在 Laravel 8 中使用 Faker 库概念的 Seeder

在 Laravel 8 中使用 Faker 库概念的 Seeder

Scroll Down

对于应用程序测试,我们总是需要数据。如果我们的应用程序正在运行,那么我们可以通过 Web 门户或其他地方创建测试数据。但是在初始阶段,即在开发阶段,我们需要大量数据。

在 Laravel 中,我们有默认系统来生成名为 Laravel Seeder 的假数据。因此,在本文中,我们将看到 Seeder 和 Factory 的概念。借助这些概念,我们将看到在 laravel 8 中生成 Fake 或测试数据。

创建数据库和连接

要创建数据库,我们可以通过PhpMyadmin 的Manual 工具或通过mysql 命令创建。

创建数据库 laravel_app;
成功,我们已经创建了一个数据库。

要连接,打开将位于项目根目录的.env文件。

DB_CONNECTION = mysql
DB_HOST = 127.0.0.1
DB_PORT = 3306
DB_DATABASE = laravel_app
DB_USERNAME =root
DB_PASSWORD =root

成功地,我们已将数据库连接到应用程序。

创建迁移以生成表

要为表创建迁移文件,我们需要运行一些简单的php artisan 命令。假设我们需要表称为学生。回到终端,所以命令将是 –

创建表的迁移命令

$ php artisan make:migration create_students_table

此命令将在位置/database/migrations处创建一个文件。文件名是这样的 - 2020_11_10_010003_create_students_table.php

打开迁移文件并编辑以下代码 -

​<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateStudentsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('students', function (Blueprint $table) {
            $table->id();
            $table->string("name", 120);
            $table->string("email", 50)->nullable();
            $table->string("mobile", 50)->nullable();
            $table->integer("age");
            $table->enum("gender", ["male", "female", "others"]);
            $table->text("address_info");
            $table->timestamp("created_at")->useCurrent();
            $table->timestamp("updated_at")->useCurrent();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('students');
    }
}


接下来,我们需要迁移到数据库中。返回终端并输入命令 -

$ php artisan migrate

它将运行所有挂起的迁移并在数据库中生成表。

生成Model, Seeder 和 Factory类文件

要分别生成Model, Seeder 和 Factor文件,然后我们为每个文件设置了 php artisan 命令。但是如果我们需要通过单个命令的帮助生成所有这些,我们也有。返回终端

生成模型、播种机 (s) 和工厂 (f) 的命令

$ php artisan make:model Student -fs

运行后,我们应该有这些文件和它们的位置。

Student模型位于 /app/Models/
StudentFactory.php位于 /database/factories/
StudentSeeder.php/database/seeders/
应用程序中的测试数据我们只能通过 Seeder 文件创建,或者我们可以说只有工厂文件。因此,让我们看看每个文件及其转储测试数据的方式。

在 Seeder 文件中使用 Faker 库

Seeder 文件用于为应用程序播种测试数据。在旧版本的 laravel 中,我们需要为其属性和方法安装 faker 库。但是在最新版本中,我们已经提供了 faker 库。

/database/seeders/ 打开 StudentSeeder.php

<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;

class StudentSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        $faker = \Faker\Factory::create();

        DB::table("students")->insert([
            "name" => $faker->name(),
            "email" => $faker->safeEmail,
            "mobile" => $faker->phoneNumber,
            "age" => $faker->numberBetween(25, 50),
            "gender" => $faker->randomElement(["male", "female", "others"]),
            "address_info" => $faker->address,
        ]);
    }
}

我们有两个选项可以运行它。首先,我们可以通过将类标志传递给命令来直接运行,而在其次,我们可以在DatabaseSeeder.php 中加载 Seeder 类,然后通过 artisan 命令运行。

直接运行 Seeder 类

运行种子类文件的命令

$ php artisan db:seed --class=StudentSeeder

上面的命令将在数据库表中插入一个虚拟行。如果需要更多,那么我们需要一次又一次地运行这个命令。但是更好的选择是我们可以将我们的代码放入 for 循环中。

使用 DatabaseSeeder 生成数据
/database/seeders/ 文件夹中使用 DatabaseSeeder.php

<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;
use Database\Seeders\StudentSeeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     *
     * @return void
     */
    public function run()
    {
        $this->call([
            StudentSeeder::class
        ]);
    }
}

现在,命令生成数据

$ php artisan db:seed

使用工厂文件在 Laravel 中生成数据

我们也可以通过单独的命令创建工厂文件。命令是

$ php artisan make:factory StudentFactory --model=Student

但是上面我们在创建模型时创建了工厂文件。从 /database/factories/ 打开 StudentFactory.php

<?php

namespace Database\Factories;

use App\Models\Student;
use Illuminate\Database\Eloquent\Factories\Factory;

class StudentFactory extends Factory
{
    /**
     * The name of the factory's corresponding model.
     *
     * @var string
     */
    protected $model = Student::class;

    /**
     * Define the model's default state.
     *
     * @return array
     */
    public function definition()
    {
        return [
            "name" => $this->faker->name(),
            "email" => $this->faker->safeEmail,
            "mobile" => $this->faker->phoneNumber,
            "age" => $this->faker->numberBetween(25, 45),
            "gender" => $this->faker->randomElement([
                "male",
                "female",
                "others"
            ]),
            "address_info" => $this->faker->address
        ];
    }
}

将工厂文件加载到 DatabaseSeeder 中
打开 DatabaseSeeder.php

<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;
use Database\Seeders\StudentSeeder;
use App\Models\Student;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     *
     * @return void
     */
    public function run()
    {
         \App\Models\Student::factory(100)->create();
    }
}

现在,命令生成数据

$ php artisan db:seed

当我们运行上面的命令时,100 个测试行将被插入到模型各自的数据库表中。

我们希望本文能帮助您以非常详细的方式了解 Laravel 8 Seeder、Factory 和生成测试数据。