数据库:播种

Introduction

Laravel 包含使用种子类为你的数据库播种数据的能力。所有种子类都存储在database/seeders 目录。默认情况下,一个DatabaseSeeder 类是为你定义的。从这个类,你可以使用call 方法运行其他种子类,允许您控制播种顺序。

Note
批量赋值保护 在数据库播种期间自动禁用。

写播种机

要生成播种机,请执行make:seeder 工匠命令.框架生成的所有播种机将被放置在database/seeders 目录:

php artisan make:seeder UserSeeder

默认情况下,播种器类仅包含一个方法:run.当db:seed 工匠命令 被执行。在run 方法,您可以根据需要将数据插入数据库。您可以使用查询生成器 手动插入数据或者您可以使用雄辩的模型工厂.

作为例子,让我们修改默认值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).'@gmail.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 特征。使用时,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
豫ICP备18041297号-2