kazak71/iseed

基于现有数据库表的记录生成新的Laravel数据库种子文件。

v3.0.3 2023-02-15 08:16 UTC

This package is auto-updated.

Last update: 2024-09-15 12:02:32 UTC


README

反向种子生成器(iSeed)是一个Laravel包,它提供了一种基于现有数据库表数据生成新种子文件的方法。

Build Status Latest Stable Version Total Downloads Analytics

安装

1. 使用Composer要求

composer require kazak71/iseed

Laravel 5.3.7及以下Laravel 4需要特定版本

composer require orangehill/iseed:2.2 # Laravel 5.3.7 and below
composer require orangehill/iseed:1.1 # Laravel 4

2. 添加服务提供者(Laravel 5.4及以下)

最新版本的Laravel具有自动发现和自动添加服务提供者的功能 - 如果你使用5.4.x及以下,请记住将其添加到/app/config/app.php中的providers数组中

// ...
Orangehill\Iseed\IseedServiceProvider::class,

Artisan命令选项

[表名]

必填参数,用于定义用于种子创建的表。使用CSV表示法为多个表指定。将为每个表生成种子文件。

示例

php artisan iseed my_table
php artisan iseed my_table,another_table

类名前缀 & 类名后缀

可选地指定 Seeder 类名和文件名的前缀或后缀。如果你想要为已有种子的表创建额外的种子而不覆盖现有种子,这很有用。

示例

php artisan iseed my_table --classnameprefix=Customized

输出 CustomizedMyTableSeeder.php

php artisan iseed my_table,another_table --classnameprefix=Customized

输出 CustomizedMyTableSeeder.php 和 CustomizedAnotherTableSeeder.php

php artisan iseed my_table --classnamesuffix=Customizations

输出 MyTableCustomizationsSeeder.php

php artisan iseed my_table,another_table --classnamesuffix=Customizations

输出 MyTableCustomizationsSeeder.php 和 AnotherTableCustomizationsSeeder.php

force

可选参数,用于自动覆盖所需表的所有现有种子

示例:以下命令将覆盖laravel的seeds目录中已存在的UsersTableSeeder.php

php artisan iseed users --force

dumpauto

可选布尔参数,用于控制composer dump-autoload命令的执行。默认为true。

示例,将阻止composer dump-autoload的执行

php artisan iseed users --dumpauto=false

clean

可选参数,用于在创建新的种子类之前清理app/database/seeds/DatabaseSeeder.php

示例

php artisan iseed users --clean

database

可选参数,用于指定数据库连接名称。

示例

php artisan iseed users --database=mysql2

max

可选参数,用于定义从指定表中种入的最大记录数。对于多个表,限制将应用于所有表。

示例

php artisan iseed users --max=10

chunksize

可选参数,用于定义每个插入查询的数据块大小。

示例

php artisan iseed users --chunksize=100

orderby

可选参数,用于定义在结合使用max参数(允许你设置要导出的数据库条目数)时用于排序结果的列。

示例

artisan iseed users --max=10 --orderby=id

direction

可选参数,允许你设置排序结果的顺序;与orderby参数一起使用。

示例

artisan iseed users --max=10 --orderby=id --direction=desc

exclude

可选参数,接受以逗号分隔的列列表,你希望从导出的表中排除这些列。对于多个表,排除将应用于所有表。

示例

php artisan iseed users --exclude=id
php artisan iseed users --exclude=id,created_at,updated_at

prerun

可选参数,将laravel事件名称分配给在种子之前触发的。如果事件监听器返回false,种子将自动失败。可以通过传递以逗号分隔的DB名称数组并相应地传递以逗号分隔的事件名称数组,为多个表名分配多个preruns。

示例:以下命令将创建一个在种子之前触发名为'someEvent'事件的种子文件。

php artisan iseed users --prerun=someEvent

以下示例将someUserEvent分配给users表的种子,并将someGroupEvent分配给groups表的种子,在种子之前执行。

php artisan iseed users,groups --prerun=someUserEvent,someGroupEvent

以下示例仅将 someGroupEvent 分配给 groups 表的种子,在种子执行之前执行。这里省略了用户表的预运行值,所以 users 表的种子将不会分配预运行事件。

php artisan iseed users,groups --prerun=,someGroupEvent

post运行

可选参数,用于在种子完成后触发一个 laravel 事件名称。如果事件监听器返回 false,则种子将执行,但会抛出一个 postrun 失败的异常。可以通过传递逗号分隔的数据库名称数组,以及相应地传递逗号分隔的 postrun 事件名称数组,为多个表名分配多个 postrun。

示例:以下命令将生成一个种子文件,在种子完成后触发名为 'someEvent' 的事件。

php artisan iseed users --postrun=someEvent

以下示例将 someUserEvent 分配给 users 表的种子,并将 someGroupEvent 分配给 groups 表的种子,在种子执行后执行。

php artisan iseed users,groups --postrun=someUserEvent,someGroupEvent

以下示例仅将 someGroupEvent 分配给 groups 表的种子,在种子执行后执行。这里省略了用户表的 post运行值,所以 users 表的种子将不会分配 post运行事件。

php artisan iseed users,groups --postrun=,someGroupEvent

noindex

使用 --noindex 选项,可以将种子生成为一个非索引数组。此功能的使用场景是在需要合并两个种子文件时。

示例

php artisan iseed users --noindex

用法

要为您的用户表生成种子文件,只需调用: \Iseed::generateSeed('users', 'connectionName', 'numOfRows');connectionNamenumOfRows 不是必需的参数。

这将在 /database/seeds(Laravel 4 为 /app/database/seeds)内部创建一个文件,内容类似于以下示例

<?php

// File: /database/seeds/UsersTableSeeder.php

class UsersTableSeeder extends Seeder {

    /**
     * Auto generated seed file
     *
     * @return void
        */
    public function run()
    {
        \DB::table('users')->truncate();
        \DB::table('users')->insert(array (
            0 =>
            array (
                'id' => '1',
                'email' => 'admin@admin.com',
                'password' => '$2y$10$tUGCkQf/0NY3w1l9sobGsudt6UngnoVXx/lUoh9ElcSOD0ERRkK9C',
                'permissions' => NULL,
                'activated' => '1',
                'activation_code' => NULL,
                'activated_at' => NULL,
                'last_login' => NULL,
                'persist_code' => NULL,
                'reset_password_code' => NULL,
                'first_name' => NULL,
                'last_name' => NULL,
                'created_at' => '2013-06-11 07:47:40',
                'updated_at' => '2013-06-11 07:47:40',
            ),
            1 =>
            array (
                'id' => '2',
                'email' => 'user@user.com',
                'password' => '$2y$10$ImNvsMzK/BOgNSYgpjs/3OjMKMHeA9BH/hjl43EiuBuLkZGPMuZ2W',
                'permissions' => NULL,
                'activated' => '1',
                'activation_code' => NULL,
                'activated_at' => NULL,
                'last_login' => '2013-06-11 07:54:57',
                'persist_code' => '$2y$10$C0la8WuyqC6AU2TpUwj0I.E3Mrva8A3tuVFWxXN5u7jswRKzsYYHK',
                'reset_password_code' => NULL,
                'first_name' => NULL,
                'last_name' => NULL,
                'created_at' => '2013-06-11 07:47:40',
                'updated_at' => '2013-06-11 07:54:57',
            ),
        ));
    }

}

此命令还将更新 /database/seeds/DatabaseSeeder.php(Laravel 4 为 /app/database/seeds/DatabaseSeeder.php)以包含对新生成的种子类的调用。

如果您希望定义自定义 iSeed 模板,其中所有调用都将放置在其中,您可以在 /database/seeds/DatabaseSeeder.php(Laravel 4 为 /app/database/seeds/DatabaseSeeder.php)中任何地方使用 #iseed_start#iseed_end 模板,例如

<?php

// File: /database/seeds/DatabaseSeeder.php
class DatabaseSeeder extends Seeder {

    /**
     * Run the database seeds.
     *
     * @return void
        */
    public function run()
    {
        Eloquent::unguard();

        if(App::environment() == "local")
        {
            throw new \Exception('Only run this from production');
        }

        #iseed_start

        // here all the calls for newly generated seeds will be stored.

        #iseed_end
    }

}

或者,您可以从命令行使用 Artisan 运行 Iseed,例如 php artisan iseed users。对于生成多个种子文件,应在命令的参数中发送逗号分隔的表名列表,例如 php artisan iseed users,posts,groups

如果您尝试生成已经存在的种子文件,命令将询问您是否要覆盖它。如果您希望默认覆盖它,请使用 Artisan 命令选项 --force,例如 php artisan iseed users --force

如果您希望清除 iSeed 模板,可以使用 Artisan 命令选项 --clean,例如 php artisan iseed users --clean。这将在创建新的种子类之前从 app/database/seeds/DatabaseSeeder.php 中清除模板。

您可以通过使用 Artisan 命令选项 --database=connection_name 指定用于创建新种子文件的数据库连接,例如 php artisan iseed users --database=mysql2

要限制从表导出的行数,请使用 Artisan 命令选项 --max=number_of_rows,例如 php artisan iseed users --max=10。如果您使用此选项导出多个指定的表,则将应用所有表的限制。

要(重新)播种数据库,请转到终端并运行 Laravel 的 db:seed 命令(php artisan db:seed)。

请注意,一些用户遇到了导出大型数据库表的问题(从具有许多记录的表播种时的错误)。此问题通过将输入数据拆分为较小的元素块来解决,每个插入语句一个块。由于您可能需要更改极端情况下 DB 表具有大量列的块大小值,因此块大小在 iSeed 的 config.php 文件中是可配置的。

'chunk_size' => 500 // Maximum number of rows per insert statement