orangehill/iseed
根据现有数据库表中的数据生成一个新的 Laravel 数据库种子文件。
Requires
- php: ^7.2|^8.0.2
- illuminate/support: ~5.5.0|~5.6.0|~5.7.0|~5.8.0|^6.0|^7.0|^8.0|^9.0|^10.0|^11.0
Requires (Dev)
- illuminate/filesystem: ~5.5.0|~5.6.0|~5.7.0|~5.8.0|^6.0|^7.0|^8.0|^9.0|^10.0|^11.0
- laravel/framework: ~5.5.0|~5.6.0|~5.7.0|~5.8.0|^6.0|^7.0|^8.0|^9.0|^10.0|^11.0
- mockery/mockery: ^1.0.0
- phpunit/phpunit: ^8.0
README
反向种子生成器(iSeed) 是一个 Laravel 扩展包,它提供了一个基于现有数据库表数据生成新种子文件的方法。
安装
1. 使用 Composer 依赖
composer require orangehill/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 名称数组为多个表名分配多个 prerun 事件名称。
示例:以下命令将创建一个在种子之前触发名为 'someEvent' 事件的种子文件。
php artisan iseed users --prerun=someEvent
以下示例将 someUserEvent
分配给 users
表的种子,并将 someGroupEvent
分配给 groups
表的种子,以在播种之前执行。
php artisan iseed users,groups --prerun=someUserEvent,someGroupEvent
以下示例仅将 someGroupEvent
分配给 groups
表的种子,以在播种之前执行。此处省略了用户表的 pre-run 值,因此 users
表的种子将不会分配任何 pre-run 事件。
php artisan iseed users,groups --prerun=,someGroupEvent
post-run
可选参数,用于在播种完成后触发一个 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-run 值,因此 users
表的种子将不会分配任何 post-run 事件。
php artisan iseed users,groups --postrun=,someGroupEvent
noindex
使用 --noindex 选项可以生成非索引数组格式的种子。此功能的用例是在需要合并两个种子文件时。
示例
php artisan iseed users --noindex
用法
要为您的用户表生成种子文件,请简单调用:\Iseed::generateSeed('users', 'connectionName', 'numOfRows');
。其中 connectionName
和 numOfRows
不是必需的参数。
这将创建一个位于 /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' => '[email protected]', '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' => '[email protected]', '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
)。
请注意,一些用户在导出大型数据库表时遇到了问题(从包含大量记录的表中导出时的错误)。通过将输入数据分割成更小的元素块来执行插入语句解决了这个问题。由于在某些极端情况下,如果数据库表有大量列,您可能需要更改块大小值,因此iSeed的config.php
文件中可配置块大小。
'chunk_size' => 500 // Maximum number of rows per insert statement