jonas-bostoen/db-seeder

简单易用的PHP数据库种子工具,基于bazil/db-seeder的生成器

1.1 2023-05-30 07:46 UTC

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种类型之一

  1. PK. 自增主键(尚不支持复合键)

  2. 关系。与某些表列值的关联

  3. 任何faker生成器

  4. 匿名函数

  5. 标量值

  6. PK. 表的主键是id,只需留下id。它将自动处理为主键。如果不是id,您必须使用完整语法来配置主键

...
'book_id'=> $generator->pk
...
  1. 关系。目前的关系是指从其他表或当前表中的某些列随机填充一些列。如果您的关联正好是some_table_name_id,且该表名也在配置中,您可以保持原样。正确的关联将被自动检测并设置。如果不是,您将必须使用完整语法。以下是为从正在填充的book_category.id列填充book表的parent_id列的示例
...
'parent_id'=>$generator->relation('book_category', 'id'),
...
  1. faker生成器。实际上使用它们非常简单。只需确保在配置列时使用$faker = \tebazil\dbseeder\FakerWrapper()而不是真实的faker实例。调用faker方法(带或不带参数)和属性,就像您通常从faker调用它们一样,使用uniqueoptional前缀,并从自动完成中受益于默认区域设置- FakerWrapper可以做到所有这些。请参阅[如何工作]部分以了解更多关于为什么我们在这里不使用Faker实例的原因。示例
...
'first_name'=>$faker->firstName,
'preview'=>$faker->text(20),
'content'=>$faker->text,
'type'=>$faker->randomElement(['shop','cv','test']),
...
  1. 匿名函数或其他PHP调用。匿名函数只需返回可以写入适当数据库列的某个标量值。您可以使用它们进行一些精确的随机选择生成器。一个明显的例子是
'user_id'=>function() {
  return rand(1, 234343);
}
  1. 纯值。每个行使用相同的值。
'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 是一个包装器)