Laravel 如何填充数据库(Seeder 用法)
php artisan make:seeder 生成填充类,run() 里用模型工厂或查询构造器插入数据,php artisan db:seed 执行。本文含工厂配合、DatabaseSeeder 编排与 migrate:fresh --seed 用法。
一句话回答:用 Seeder:php artisan make:seeder UserSeeder 生成填充类,在它的 run() 方法里写插入逻辑(推荐配合模型工厂 User::factory(50)->create()),然后 php artisan db:seed --class=UserSeeder 执行;DatabaseSeeder 里用 $this->call() 编排多个 Seeder 的执行顺序。
版本范围:以下 Laravel 示例按 12.x 官方文档核对;其他版本请检查对应 API 与配置差异。
快速上手
1. 生成 Seeder
php artisan make:seeder UserSeeder
文件生成在 database/seeders/UserSeeder.php。
2. 编写 run() 方法
namespace Database\Seeders;
use App\Models\User;
use Illuminate\Database\Seeder;
class UserSeeder extends Seeder
{
public function run(): void
{
// 本例只生成开发/测试假数据,不创建生产管理员。
if (! app()->environment(['local', 'testing'])) {
throw new \RuntimeException('Demo seeder requires local/testing');
}
User::factory(50)->create();
}
}
3. 在 DatabaseSeeder 中编排
class DatabaseSeeder extends Seeder
{
public function run(): void
{
$this->call([
UserSeeder::class,
PostSeeder::class,
CommentSeeder::class,
]);
}
}
4. 执行
先核对实际数据库连接和备份。下面的 migrate:fresh --seed 会删除目标连接中的所有表(不只本项目建的表),仅可用于可丢弃的专用开发/测试库;不要直接复制到生产终端。
php artisan db:seed # 跑 DatabaseSeeder
php artisan db:seed --class=UserSeeder # 只跑指定 Seeder
php artisan migrate:fresh --seed # 重建全库 + 填充(开发期常用)
模型工厂配合
没有工厂先创建:
php artisan make:factory PostFactory --model=Post
工厂里用 Faker 生成假数据:
public function definition(): array
{
return [
'title' => fake()->sentence(),
'body' => fake()->paragraphs(3, true),
'user_id' => User::factory(), // 自动建关联用户
];
}
注意事项
- 生产环境慎用:
db:seed并非仅允许 local;Laravel 在生产环境要求确认,--force只是跳过确认,务必确认 Seeder 写的是初始化数据而非测试假数据 - 大数据量分批:插 10 万条别一次
create,用chunk/insert批量数组,内存和速度都更可控 - migrate:fresh --seed 会清空全库,只在开发环境使用
常见问题(FAQ)
Q:执行 db:seed 报 "Class UserSeeder not found"?
A:composer 自动加载没刷新:composer dump-autoload;再检查 Seeder 文件的 namespace 是否为 Database\Seeders。
Q:想让填充可重复执行不重复插数据?
A:为业务唯一键建立唯一约束,再按该键使用 updateOrCreate / firstOrCreate。上面的工厂示例重复执行会继续插入 50 条,不是幂等的;仅看全表 count 无法判断所需初始化记录是否齐全。
Q:能只填充测试环境的数据库吗?
A:可用 php artisan db:seed --env=testing,但环境名不保证数据库隔离:先确认测试连接指向专用测试库、配置缓存没有覆盖它。PHPUnit 运行时可在测试配置中指定数据库,再使用 RefreshDatabase 与 $this->seed();phpunit.xml 不会自动应用于普通 Artisan 命令。
核查依据
本文依据官方文档核对,示例未在实际业务环境运行;上线前请按部署版本、权限与数据范围验证。