tebazil/db-seeder
使用 faker 生成器的简单 PHP 数据库填充工具
Requires
- fzaninotto/faker: ^1.5
Requires (Dev)
- phpunit/phpunit: ~4.0
This package is not auto-updated.
Last update: 2024-09-21 09:15:09 UTC
README
瞬间用假数据填充您的数据库!
- 非常容易使用!
- 使用经过时间考验的 fzaninotto/faker 生成器
- 轻松将生成器映射到数据库列
- 支持关联数据
- 两种方式填充表:生成器或普通数组
- 能够使用您自己的生成器
- 现代 IDE 的友好自动完成(已在 phpstorm 中测试)
安装
安装此扩展的首选方式是通过 Composer。
运行
$ composer require tebazil/db-seeder
或者将以下内容添加到您的 composer.json
文件的 require
部分:
"tebazil/db-seeder": "*"
require
快速开始
您可以使用类似以下方法快速用生成数据填充数据库
$pdo = new PDO('mysql:localhost', 'root', 'test'); $seeder = new \tebazil\dbseeder\Seeder($pdo); $generator = $seeder->getGeneratorConfigurator(); $faker = $generator->getFakerConfigurator(); $seeder->table('article')->columns([ 'id', //automatic pk 'book_id', //automatic fk 'name'=>$faker->firstName, 'content'=>$faker->text ])->rowQuantity(30); $seeder->table('book')->columns([ 'id', 'name'=>$faker->text(20), ])->rowQuantity(30); $seeder->table('category')->columns([ 'id', 'book_id', 'name'=>$faker->text(20), 'type'=>$faker->randomElement(['shop','cv','test']), ])->rowQuantity(30); $seeder->refill();
!!! 注意!$seeder->refill();
会截断所有指定的表并使用提供的配置用随机数据填充它们。如果您操作的是生产/敏感数据库,可能会删除有意义的数据库。请确保您知道自己在做什么。
让我们看看这里会发生什么。首先,您正在创建一个 pdo 连接,并用它初始化新的 $seeder
对象。然后您创建一个生成器实例和 faker 包装器实例,以利用自动完成功能。然后您为 seeder 配置每个表。然后您请求填充所有配置的表。就这么简单。
从生成器填充表
每个列都配置了适当的生成器。生成器可以是以下 5 种类型之一
-
PK. 自增主键(目前不支持复合键)
-
关联。关联到某些表的列的值
-
任何 faker 生成器
-
匿名函数
-
标量值
-
PK. 表的主键是
id
,只需留下id
即可。它将自动被处理为主键。如果它不是id
,您将不得不使用完整语法来配置主键
... 'book_id'=> $generator->pk ...
- 关联。目前关联是指从其他或当前表的列中随机填充某些列。如果您的关联确实是
some_table_name_id
且该表名也在配置中,您可以直接留下。正确的关联将自动检测并设置。如果不是,您将不得不使用完整语法。以下是为从book_category
.id 列填充book
表的parent_id
列的示例
... 'parent_id'=>$generator->relation('book_category', 'id'), ...
- faker 生成器。实际上它们非常容易使用。只需确保在配置列时使用
$faker = \tebazil\dbseeder\FakerWrapper()
而不是真实的 faker 实例。调用 faker 方法(带或不带参数)和属性,就像您通常从 faker 调用它们一样,使用unique
和optional
前缀,并从FakerWrapper
获得自动完成默认区域设置的功能。请参阅 [如何工作] 部分,了解更多为什么在这里不使用 Faker 实例。示例
... 'first_name'=>$faker->firstName, 'preview'=>$faker->text(20), 'content'=>$faker->text, 'type'=>$faker->randomElement(['shop','cv','test']), ...
- 匿名函数或其他 php 可调用。匿名函数只需要返回可以写入适当数据库列的标量值。您可以使用它们来执行一些精确的随机选择生成器,例如。明显的示例是
'user_id'=>function() { return rand(1, 234343); }
- 普通值。每个行使用相同的值。
'is_active'=>1
注意:您不能将这些值用作普通值类型
- 任何 php 可调用字符串(它们将被调用)
- 'pk'
- 'relation'
- 'faker'
从数组填充表
您也可以直接从数组填充表。
对于具有数字键的数组,您必须显式定义相应的列名。如果您不想使用某些列,只需在列配置中使用false/null。如果您没有配置某些数组列,则它们将不会被使用。
$array = [ [1,'twinsen','the heir'], [2,'zoe', 'self-occupied'], [3, 'baldino', 'twinsunian elephant'] ]; $columnConfig = [false,'name','occupation']; $seeder->table('users')->data($array, $columnConfig)->rowQuantity(30);
对于键对应于表列的数组,您可以省略列配置。
关于rowQuantity的说明
您可以为每个表设置所需的行数。如果没有设置,则默认值(30)将被使用。从数组填充的逻辑如下:如果您没有定义行数,则所有数组将被填充。如果您使用的值大于提供的数组中的“行”数,则给定数组将被迭代以填充所需的行数。如果您提供的值小于数组中的行数,则将使用该行数。
工作原理
当您发出类似以下命令时
$seeder->table('category')->columns([ 'id', 'book_id', 'name'=>$faker->text(20), 'type'=>$faker->randomElement(['shop','cv','test']), ])->rowQuantity(30);
不会对您的数据库进行任何操作。当调用refill()
方法时,它首先填充不依赖于其他表的表。然后它迭代以填充其他(依赖)表。
常见问题解答
问:为什么您使用faker包装器而不是faker实例?答:简短回答:为了提供更简洁的语法。长回答:Faker生成器在调用时立即提供假数据。我们需要这些数据在填充每个字段时都可用,而不仅仅是使用一次。因此,我们可以使用匿名函数在每次需要不同值时从faker获取一些数据结果,如下所示
'first_name'=>function() use($faker) { return $faker->firstName; }
($faker
是一个真实的faker实例)
或者,如果我们在这里使用FakerWrapper
,我们可以使用更干净的语法
'first_name'=>$faker->firstName
($faker
是一个包装器)