在我的博客应用中,每个篇博客文章都属于某一个专栏,在显示文章列表之前,先为专栏填充一些数据。
填充文件
Laravel 内置了一个可为你的数据库填充测试数据的填充类。所有的填充类都放在 database/seeds
目录下。Laravel 默认定义了一个 DatabaseSeeder
类。通过这个类,你可以用 call 方法来运行其他的 seed
类,从而控制数据填充的顺序。
运行 artisan
命令 make:seeder
可以生成 Seeder,框架生成的seeders
都放在 database/seeders
目录下:
php artisan make:seeder ColumnSeeder
打开生成的 ColumnsSeeder
文件,看看默认代码:
<?php
namespace Database\Seeders;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
class ColumnsSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
//
}
}
Seeder 类只包含一个默认方法:run
。这个方法会在执行 db:seed
这个 Artisan command
命令时被调用。在run
方法里,可以按需在数据库中插入数据。
模型工厂
手动为每个模型填充指定属性很麻烦,在 Laravel 中可以使用模型工厂轻松地生成大量数据库数据。
移除默认工厂
Laravel 项目的工厂文件默认存放在 database/factories
目录下,Laravel 项目默认生成了 UserFactory.php
文件,如前面所说一样,在这个博客项目中用不到,可以移除掉:
rm database/factories/UserFactory.php
添加工厂文件
运行如下命令添加数据工厂:
php artisan make:factory ColumnFactory
打开生成的 ColumnFactory
工厂文件,可以看到默认代码如下:
<?php
namespace Database\Factories;
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\Column>
*/
class ColumnFactory extends Factory
{
/**
* Define the model's default state.
*
* @return array<string, mixed>
*/
public function definition()
{
return [
//
];
}
}
定义工厂后,可以在模型中使用 Illuminate\Database\Eloquent\Factories\HasFactory
特性提供的 factory
静态方法,来为模型实例化工厂。
HasFactory
特性的 factory
方法将按约定来为模型确定合适的工厂。具体来说,该方法将在 Database\Factorys
的命名空间下查找类名与模型名相匹配,并以 Factory
为后缀的工厂。
修改 ColumnFactory
修改 ColumnFactory.php
文件,文件内容如下:database/factories/ColumnFactory.php
。
<?php
namespace Database\Factories;
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\Column>
*/
class ColumnFactory extends Factory
{
/**
* Define the model's default state.
*
* @return array<string, mixed>
*/
public function definition()
{
return [
'name' => $this->faker->sentence()
];
}
}
Faker
是一个假数据生成库,sentence()
是 faker
提供的 API
,随机生成『小段落』文本。我们用来填充 name
专栏名称字段。
修改 ColumsSeeder
修改 ColumnFactory.php
文件,文件内容如下:database/seeders/ColumnSeeder.php
。
<?php
namespace Database\Seeders;
use App\Models\Column;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
class ColumnsSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
Column::factory()->count(10)->create();
}
}
User::factory()
是模型方法,当我们在模型里使用 trait HasFactory
时会注入此方法。返回的是模型工厂类实例,对应加载 ColumnFactory.php
类。
count(5)
指定生成模型的数量,此处生成 10 个专栏数据。
注册数据填充
接下来注册数据填充:databases/seeders/DatabaseSeeder.php
。
<?php
namespace Database\Seeders;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
/**
* Seed the application's database.
*
* @return void
*/
public function run()
{
$this->call(ColumnsSeeder::class);
}
}
执行数据填充
运行如下命令执行数据填充:
php artisan db:seed
执行完成后就可以看到columns
数据表增加了 10 条数据。