跳转到主要内容

什么是 Seeding

Seeding(填充)是向数据库写入示例数据或初始数据的机制。 在搭建开发环境或运行自动化测试时,通常需要预先有一定的数据。由于每次手动输入数据非常繁琐,可以将其整理为可重复执行的 Seeder。 Seeder 类存放在 database/seeders 目录下。默认会提供一个 DatabaseSeeder 类。

创建 Seeder

使用 make:seeder Artisan 命令生成一个新的 Seeder 类。
生成的文件会放在 database/seeders/UserSeeder.php

编写 Seeder

run() 方法中编写数据写入逻辑。你可以使用 DB 门面或 Eloquent 模型来插入数据。

使用 DB 门面

使用 Eloquent 模型

Seeding 执行期间,批量赋值保护会自动被禁用。你无需关心 $fillable$guarded 的配置就可以插入数据。

与模型工厂结合使用

如果需要大量测试数据,与模型工厂结合使用会非常方便。工厂能够批量生成带有随机字段的假数据。
关于工厂的详细用法请参阅 Eloquent 工厂文档。

DatabaseSeeder 的用法

DatabaseSeeder 是统一管理多个 Seeder 的入口。使用 call() 方法指定要执行的 Seeder。
Seeder 会按照传给 call() 的顺序执行。如果存在外键约束,请让被引用的表先填充(如:usersposts)。

运行 Seeder

运行所有 Seeder

将会调用 DatabaseSeeder,然后按顺序执行通过 call() 指定的 Seeder。

只执行特定 Seeder

使用 --class 选项可以指定要执行的 Seeder 类。

与迁移一起执行

migrate:fresh 命令上添加 --seed 选项,可以先重建所有数据表,然后统一执行 Seeder。
如果只需执行特定 Seeder,可以使用 --seeder 选项。
migrate:fresh 会删除并重建所有表,现有数据都会丢失,因此不要在生产环境中使用。

在生产环境中执行

在生产环境执行 Seeding 时会出现确认提示。如果不需要确认,可以使用 --force 标记。
在生产环境执行 Seeding 可能造成数据被覆盖或丢失。执行前请务必做好备份。

抑制模型事件

如果希望在 Seeding 期间阻止 creatingcreated 等模型事件被触发,可以使用 WithoutModelEvents trait。
该 trait 也会作用于通过 call() 调用的子 Seeder。

实战示例:博客应用的 Seeder

以一个包含用户与帖子的博客应用为例,来搭建初始数据。
执行步骤:

下一步

Eloquent 入门

学习如何通过 Eloquent ORM 获取和操作已通过 Seeder 写入的数据。
最后修改于 2026年7月18日