Laravel 提供了使用填充类为数据库填充数据的功能。所有填充类都存储在 database/seeders 目录中。默认情况下,已为你定义了一个 DatabaseSeeder 类。从这个类中,你可以使用 call 方法来运行其他填充类,从而让你能够控制填充顺序。
[!注意]
批量赋值保护在数据库填充期间会自动禁用。
要生成一个填充器,执行 make:seeder Artisan 命令。框架生成的所有填充器都将放置在 database/seeders 目录中:
php artisan make:seeder UserSeeder一个 Seeder 类默认仅包含一个方法:run。当执行 db:seed Artisan 命令时,会调用此方法。在 run 方法中,你可以随心所欲地向数据库中插入数据。你可以使用 查询构建器 手动插入数据,也可以使用 Eloquent 模型工厂。
作为示例,让我们修改默认的 DatabaseSeeder 类,并添加一个数据库插入语句到 run 方法中:
<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Str;
class DatabaseSeeder extends Seeder
{
/**
* Run the database seeders.
*/
public function run(): void
{
DB::table('users')->insert([
'name' => Str::random(10),
'email' => Str::random(10).'@example.com',
'password' => Hash::make('password'),
]);
}
}[!NOTE]
您可以在run方法的签名中类型提示任何您需要的依赖。它们将通过 Laravel 服务容器 自动解析。
当然,手动为每个模型种子指定属性是繁琐的. 相反,你可以使用模型工厂来方便地生成大量数据库记录. 首先,查阅模型工厂文档以了解如何定义你的工厂.
例如,我们来创建 50 个用户,每个用户都有一篇相关帖子:
use App\Models\User;
/**
* Run the database seeders.
*/
public function run(): void
{
User::factory()
->count(50)
->hasPosts(1)
->create();
}在 DatabaseSeeder 类中,您可以使用 call 方法来执行额外的种子类。使用 call 方法可以让您将数据库填充拆分为多个文件,这样就不会有单个种子类变得过于庞大。call 方法接受一个应该被执行的种子类数组:
/**
* Run the database seeders.
*/
public function run(): void
{
$this->call([
UserSeeder::class,
PostSeeder::class,
CommentSeeder::class,
]);
}在运行填充数据时,你可能希望阻止模型调度事件。 你可以使用 WithoutModelEvents trait 来实现此目的。 使用时,WithoutModelEvents trait 确保没有模型事件被调度,即使通过 call 方法执行了额外的填充数据类:
<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
class DatabaseSeeder extends Seeder
{
use WithoutModelEvents;
/**
* Run the database seeders.
*/
public function run(): void
{
$this->call([
UserSeeder::class,
]);
}
}你可以执行 db:seed Artisan 命令来填充你的数据库。默认情况下,db:seed 命令会运行 Database\Seeders\DatabaseSeeder 类,该类又可以调用其他填充类。然而,你可以使用 --class 选项来单独运行一个特定的填充类:
php artisan db:seed
php artisan db:seed --class=UserSeeder您也可以使用 migrate:fresh 命令结合 --seed 选项来填充您的数据库,该选项将删除所有表格并重新运行所有迁移。此命令对于完全重建数据库非常有用。可以使用 --seeder 选项来指定要运行的特定填充器:
php artisan migrate:fresh --seed
php artisan migrate:fresh --seed --seeder=UserSeeder一些填充操作可能会导致您更改或丢失数据。为了保护您免免受在生产数据库上运行填充命令的风险,在 production 环境中执行填充器之前,系统会提示您进行确认。要强制填充器在没有提示的情况下运行,请使用 --force 标志:
php artisan db:seed --force