数据库:播种
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