Laravel 博客开发|数据填充
在博客应用中,在展示文章列表之前(段落保持不变),每一篇博客文章都会被归入某个类别(动词从被动到主动),并会收集基础信息(名词替换)。
填充文件
Laravel 提供了一个名为 DatabaseSeeder 的核心工具,默认实现了该功能,并将所有相关的种子文件放置在位于数据库目录下的特殊子目录中。通过调用其 call 方法即可管理所有种子文件的执行顺序。
启动artisan命令make:seeder将创建Seeder,并使框架生成的所有seeders放置在特定的位置上。
php artisan make:seeder ColumnSeeder
AI写代码
打开生成的 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()
{
//
}
}
AI写代码
Seeder类仅包含一个默认的方法:run。该方法会在执行db:seed命令时被调用。在运行该方法时,可以根据需求向数据库中注入数据
模型工厂
耗时且繁琐的工作是为每个模型配置属性设置;通过 Laravel 提供的模型工厂快速高效地创建并管理大量数据库记录。
移除默认工厂
Laravel项目的工厂文件被默认放置于database/factories目录中。该 Laravel 项目会自动生成 UserFactory.php 文件。如同之前所述,在此博客项目中通常不需要使用此功能。因此建议删除该文件:
rm database/factories/UserFactory.php
AI写代码
添加工厂文件
运行如下命令添加数据工厂:
php artisan make:factory ColumnFactory
AI写代码
打开生成的 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 [
//
];
}
}
AI写代码
定义工厂后,在模型中可用 Illuminate\Database\EloquentEncoders/HasFactory 特性支持的静态工厂方法来为模型实例化工厂
HasFactory 特性的 factory 方法将按照规定来确定合适的工厂。具体而言,在 DatabasecbaILs 的命名空间中会查找类名与模型名称相符的情况,并以 Factory 为后缀识别相应的工厂。
修改 ColumnFactory
优化 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()
];
}
}
AI写代码
Faker 是一个生成虚拟文本的工具库;其提供的 sentence() 方法能够自动生成『小段落』级别的内容;这些内容被用于将 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();
}
}
AI写代码
User::factory()充当了一个模型工厂的方法;当我们导入 HasFactory trait 到模型中时,则会注入该方法;它返回的是一个工厂类实例对象;对应于加载了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);
}
}
AI写代码
执行数据填充
运行如下命令执行数据填充:
php artisan db:seed
AI写代码
执行完成后就可以看到columns 数据表增加了 10 条数据。
