数据填充

未匹配的标注
本文档最新版为 11.x,旧版本可能放弃维护,推荐阅读最新版!

数据填充

简介

Laravel 提供了使用 Seeder 类向数据库填充数据的功能。所有 Seeder 类都存放在 database/seeders 目录下。默认情况下,会为你生成一个 DatabaseSeeder 类。通过这个类,你可以使用 call 方法运行其他 Seeder 类,从而控制填充的顺序。

[!注意]
在数据库填充期间,批量赋值保护 会自动被禁用。

编写 Seeder

要生成一个 Seeder,可以执行 make:seeder Artisan 命令。框架生成的所有 Seeder 都会放置在 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
{
    /**
     * 运行数据库填充器
     */
    public function run(): void
    {
        DB::table('users')->insert([
            'name' => Str::random(10),
            'email' => Str::random(10).'@example.com',
            'password' => Hash::make('password'),
        ]);
    }
}

[!注意]
你可以在 run 方法的参数中声明任何依赖,它们会通过 Laravel 的 服务容器 自动解析。

使用模型工厂

当然,为每个模型手动指定属性来填充数据很麻烦。相反,你可以使用 模型工厂 来方便地生成大量数据库记录。首先,请查看 模型工厂文档 学习如何定义工厂。

例如,我们创建 50 个用户,并且每个用户都有一篇关联的文章:

use App\Models\User;

/**
 * 运行数据库填充器
 */
public function run(): void
{
    User::factory()
        ->count(50)
        ->hasPosts(1)
        ->create();
}

调用其他 Seeder

DatabaseSeeder 类中,你可以使用 call 方法执行其他 Seeder 类。使用 call 方法可以将数据库填充拆分成多个文件,避免单个 Seeder 类过大。call 方法接受一个包含要执行的 Seeder 类的数组:

/**
 * 运行数据库填充器
 */
public function run(): void
{
    $this->call([
        UserSeeder::class,
        PostSeeder::class,
        CommentSeeder::class,
    ]);
}

静音模型事件

在运行 Seeder 时,你可能希望阻止模型触发事件。可以通过使用 WithoutModelEvents trait 来实现。使用该 trait 后,即使通过 call 方法执行其他 Seeder 类,也不会触发任何模型事件:

<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;

class DatabaseSeeder extends Seeder
{
    use WithoutModelEvents;

    /**
     * 运行数据库填充器
     */
    public function run(): void
    {
        $this->call([
            UserSeeder::class,
        ]);
    }
}

运行 Seeder

你可以执行 db:seed Artisan 命令来填充数据库。默认情况下,db:seed 命令会运行 Database\Seeders\DatabaseSeeder 类,该类又可以调用其他 Seeder 类。不过,你也可以使用 --class 选项指定单独的 Seeder 类来运行:

php artisan db:seed

php artisan db:seed --class=UserSeeder

你也可以使用 migrate:fresh 命令结合 --seed 选项来填充数据库,这会删除所有表并重新执行所有迁移。此命令适合用来彻底重建数据库。--seeder 选项可用于指定要运行的特定 Seeder:

php artisan migrate:fresh --seed

php artisan migrate:fresh --seed --seeder=UserSeeder

在生产环境中强制运行 Seeder

某些填充操作可能会修改或丢失数据。为了保护你的生产数据库,Laravel 会在 production 环境中运行 Seeder 前提示确认。若想在生产环境中无需提示直接运行 Seeder,可以使用 --force 参数:

php artisan db:seed --force

本文章首发在 LearnKu.com 网站上。

本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

原文地址:https://learnku.com/docs/laravel/12.x/se...

译文地址:https://learnku.com/docs/laravel/12.x/se...

上一篇 下一篇
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
贡献者:1
讨论数量: 0
发起讨论 只看当前版本


暂无话题~