数据库:Seeding
介绍
Laravel 提供了使用种子类为数据库填充数据的功能。所有种子类都存储在database/seeders
目录中。默认情况下,系统DatabaseSeeder
会为您定义一个类。您可以从这个类中使用该call
方法运行其他种子类,从而控制填充顺序。
在数据库Seeding期间,批量分配保护会自动禁用。
编写种子
要生成种子,请执行make:seeder
Artisan 命令。框架生成的所有种子都将放置在以下database/seeders
目录中:
1php artisan make:seeder UserSeeder
默认情况下,种子类仅包含一个方法: 。执行Artisan 命令run
时会调用此方法。在该方法中,您可以根据需要将数据插入数据库。您可以使用查询生成器手动插入数据,也可以使用Eloquent 模型Factories。db:seed
run
作为示例,让我们修改默认DatabaseSeeder
类并在方法中添加数据库插入语句run
:
1<?php 2 3namespace Database\Seeders; 4 5use Illuminate\Database\Seeder; 6use Illuminate\Support\Facades\DB; 7use Illuminate\Support\Facades\Hash; 8use Illuminate\Support\Str; 9 10class DatabaseSeeder extends Seeder11{12 /**13 * Run the database seeders.14 */15 public function run(): void16 {17 DB::table('users')->insert([18 'name' => Str::random(10),19 'email' => Str::random(10).'@example.com',20 'password' => Hash::make('password'),21 ]);22 }23}
你可以在方法签名中键入任何所需的依赖项。它们将通过 Laravel服务容器run
自动解析。
使用模型Factories
当然,手动指定每个模型种子的属性非常繁琐。您可以使用模型Factories来便捷地生成大量数据库记录。首先,请查看模型Factories文档,了解如何定义Factories。
例如,让我们创建 50 个用户,每个用户都有一个相关帖子:
1use App\Models\User; 2 3/** 4 * Run the database seeders. 5 */ 6public function run(): void 7{ 8 User::factory() 9 ->count(50)10 ->hasPosts(1)11 ->create();12}
调用其他Seeding者
在类中DatabaseSeeder
,你可以使用该call
方法执行其他种子类。使用该call
方法可以将数据库种子拆分成多个文件,这样单个种子类就不会太大。该call
方法接受一个需要执行的种子类数组:
1/** 2 * Run the database seeders. 3 */ 4public function run(): void 5{ 6 $this->call([ 7 UserSeeder::class, 8 PostSeeder::class, 9 CommentSeeder::class,10 ]);11}
静音模型事件
在运行种子类时,您可能希望阻止模型派发事件。您可以使用WithoutModelEvents
trait 来实现这一点。使用WithoutModelEvents
trait 时,即使通过以下方法执行了其他种子类,也不会派发任何模型事件call
:
1<?php 2 3namespace Database\Seeders; 4 5use Illuminate\Database\Seeder; 6use Illuminate\Database\Console\Seeds\WithoutModelEvents; 7 8class DatabaseSeeder extends Seeder 9{10 use WithoutModelEvents;11 12 /**13 * Run the database seeders.14 */15 public function run(): void16 {17 $this->call([18 UserSeeder::class,19 ]);20 }21}
运行Seeding机
你可以执行db:seed
Artisan 命令来为数据库填充种子。默认情况下,该db:seed
命令会运行Database\Seeders\DatabaseSeeder
该类,而该类又可能会调用其他种子类。不过,你也可以使用--class
选项指定要单独运行的特定种子类:
1php artisan db:seed2 3php artisan db:seed --class=UserSeeder
migrate:fresh
您还可以结合使用命令和选项来Seeding数据库--seed
,这将删除所有表并重新运行所有迁移。此命令对于完全重建数据库非常有用。该--seeder
选项可用于指定要运行的特定Seeding器:
1php artisan migrate:fresh --seed2 3php artisan migrate:fresh --seed --seeder=UserSeeder
强制在生产环境中运行Seeding机
某些Seeding操作可能会导致数据更改或丢失。为了避免对生产数据库运行Seeding命令,在环境中执行Seeding程序之前,系统会Prompts您确认production
。要强制Seeding程序在不Prompts的情况下运行,请使用以下--force
标志:
1php artisan db:seed --force