jonas-bostoen / db-seeder
简单易用的PHP数据库种子工具,基于bazil/db-seeder的生成器
Requires
- fzaninotto/faker: ^1.5
Requires (Dev)
- phpunit/phpunit: ~4.0
This package is auto-updated.
Last update: 2024-09-30 01:52:30 UTC
README
这是tebazil/db-seeder的编辑版本,因此在种子之前不会截断表。这样就不会丢失外键。
版权 © 2015, Vasiliy Baukin (https://github.com/tebazil) 版权所有。
描述
立即用假数据填充您的数据库!
- 非常易于使用!
- 使用经过时间考验的fzaninotto/faker生成器
- 轻松将生成器映射到数据库列
- 支持相关数据
- 两种填充表的方式:生成器或纯数组
- 能够使用您自己的生成器
- 现代IDE的友好自动完成(在phpstorm中测试过)
安装
安装此扩展的首选方法是使用composer。
运行
$ composer require tebazil/db-seeder
或添加
"tebazil/db-seeder": "*"
到您的composer.json文件的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 是一个包装器)