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(),     // 自动建关联用户
    ];
}

注意事项

  1. 生产环境慎用:db:seed 并非仅允许 local;Laravel 在生产环境要求确认,--force 只是跳过确认,务必确认 Seeder 写的是初始化数据而非测试假数据
  2. 大数据量分批:插 10 万条别一次 create,用 chunk/insert 批量数组,内存和速度都更可控
  3. 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 命令。

核查依据

本文依据官方文档核对,示例未在实际业务环境运行;上线前请按部署版本、权限与数据范围验证。


延伸阅读

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台