riley19280/persistent-seeders

以集中和优雅的方式持久化数据

v1.0.1 2024-05-29 22:58 UTC

This package is auto-updated.

Last update: 2024-09-14 15:52:59 UTC


README

GitHub Workflow Status (master) Total Downloads Latest Version License

持久化种子

持久化种子允许您轻松地在中央位置维护您的种数据,并确保数据只插入一次。

该工具的一个主要用例是角色。在应用程序开始时,您可能希望支持几个角色

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