对于应用程序测试,我们总是需要数据。如果我们的应用程序正在运行,那么我们可以通过 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 和生成测试数据。
评论区