riley19280 / persistent-seeders
以集中和优雅的方式持久化数据
v1.0.1
2024-05-29 22:58 UTC
Requires
Requires (Dev)
- laravel/pint: ^1.0
- mockery/mockery: ^1.6
- nunomaduro/collision: ^7|^8
- orchestra/testbench: ^9.1
- pestphp/pest: ^2.9
- pestphp/pest-plugin-arch: ^2.0
- phpstan/extension-installer: ^1.1
- phpstan/phpstan: ^1.10
- phpstan/phpstan-deprecation-rules: ^1.0
- phpstan/phpstan-phpunit: ^1.0
- spatie/invade: ^1.0
README
持久化种子
持久化种子允许您轻松地在中央位置维护您的种数据,并确保数据只插入一次。
该工具的一个主要用例是角色。在应用程序开始时,您可能希望支持几个角色
class RoleSeeder extends PersistentSeeder { #[SeederId('6f7b4e00-97d9-4cb0-8a6b-c092e73755e3')] function initialRoles() { Role::create(['name' => 'Admin']); Role::create(['name' => 'User']); } }
随着开发的进行,您意识到需要更多的角色。通常的做法是更新常规的种器,并手动编写一个迁移来插入新角色,然后在生产环境中运行它。然而,使用持久化种子,整个过程可以自动化。您需要做的只是在新文件中添加一个新函数!现在看起来像这样
class RoleSeeder extends PersistentSeeder { #[SeederId('6f7b4e00-97d9-4cb0-8a6b-c092e73755e3')] function initialRoles() { Role::create(['name' => 'Admin']); Role::create(['name' => 'User']); } #[SeederId('ef97efe9-40bd-4948-a1cd-feeb8fb1b27f')] function managerRole() { Role::create(['name' => 'Manager']); } }
当种器再次运行时,只有新的 Manager
角色将被创建。无需乱搞迁移,无需搜索其他存在的角色。只需简单地了解您应用程序的数据。
安装
您可以通过 composer 安装此包
composer require riley19280/persistent-seeders
然后发布迁移
php artisan vendor:publish --tag=persistent-seeder-migrations
使用方法
创建一个新的数据库种器,并从 PersistentSeeders\PersistentSeeder
扩展。
然后创建您的种函数,并将 SeederId
属性添加到方法中。该属性将方法标记为种器,并依赖于传递给它的 uuid 以防止重复运行。如果此 id 发生变化,则该函数将再次运行。
php artisan make:seeder
class RoleSeeder extends PersistentSeeder { #[SeederId('6f7b4e00-97d9-4cb0-8a6b-c092e73755e3')] function initialRoles() { Role::create(['name' => 'Admin']); } }
额外配置
默认情况下,种函数运行记录存储在 seeders
表中。如果您想更改该位置,可以发布配置文件并更改 table_name
属性。
php artisan vendor:publish --tag=persistent-seeder-config
return [ 'table_name' => 'my_custom_table_name', ];
生产使用
尽管您可能犹豫在生产环境中运行 "种器",但此包非常适合生产使用。
最直接的方法是创建一个 ProductionSeeder
类作为常规种器,然后将其作为部署过程的一部分运行。
class ProductionSeeder extends Seeder { public function run(): void { // Each of these is a PersistentSeeder $this->call(TenantSeeder::class); $this->call(RoleSeeder::class); $this->call(UserSeeder::class); } }
php artisan db:seed --class=ProductionSeeder --force
或者,您可以单独运行每个
php artisan db:seed --class=TenantSeeder --force php artisan db:seed --class=RoleSeeder --force php artisan db:seed --class=UserSeeder --force