tebazil/db-seeder

使用 faker 生成器的简单 PHP 数据库填充工具

1.0.1 2021-11-19 18:13 UTC

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

  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是一个包装器)