数据库填充
在 0.5.0 版本中,Phinx 引入了用测试数据填充数据库的功能。Seed 类(填充类)是在数据库创建后为其轻松填充数据的好方法。默认情况下,它们存储在 seeds 目录中;但是,此路径可以在你的配置文件中更改。
seeds 目录。创建一个新的 Seed 类
Phinx 包含一个可以轻松生成新 Seed 类的命令:
$ php vendor/bin/phinx seed:create UserSeeder
如果你指定了多个 seed 路径,系统会提示你选择在哪个路径下创建新的 seed 类。
它基于一个骨架模板:
<?php
use Phinx\Seed\AbstractSeed;
class MyNewSeeder extends AbstractSeed
{
/**
* Run 方法。
*
* 使用此方法编写你的数据库 seeder。
*
* 有关编写 seeder 的更多信息,请参阅:
* https://book.cakephp.org/phinx/0/en/seeding.html
*/
public function run() : void
{
}
}
AbstractSeed 类
所有的 Phinx seed 都继承自 AbstractSeed 类。这个类为创建你的 seed 类提供了必要的支持。Seed 类主要用于插入测试数据。
Run 方法
当你执行 seed:run 命令时,run 方法会被 Phinx 自动调用。你应该使用这个方法来插入你的测试数据。
seed 类已经运行过。这意味着数据库 seeder 可以重复运行。在开发它们时请记住这一点。Init 方法
如果 init() 方法存在,Phinx 会在 run 方法之前运行它。这可以用于在使用 run 之前初始化 Seed 类的属性。
Should Execute 方法
shouldExecute() 方法在执行 seed 之前由 Phinx 运行。这可以用来阻止 seed 在此时执行。默认情况下,它总是返回 true。你可以在你的自定义 AbstractSeed 实现中覆盖它。
外键依赖
你通常会发现 seeder 需要按特定顺序运行,这样它们才不会违反外键约束。要定义这个顺序,你可以实现 getDependencies() 方法,该方法返回一个在当前 seeder 之前运行的 seeder 数组:
<?php
use Phinx\Seed\AbstractSeed;
class ShoppingCartSeeder extends AbstractSeed
{
public function getDependencies()
{
return [
'UserSeeder',
'ShopItemSeeder'
];
}
public function run() : void
{
// 在 `UserSeeder` 和 `ShopItemSeeder` 运行之后,
// 填充购物车。
}
}
依赖关系仅在执行所有 seed 类时(默认行为)被考虑。在运行特定的 seed 类时,它们将不被考虑。
插入数据
使用 Table 对象
Seed 类也可以使用熟悉的 Table 对象来插入数据。你可以通过在你的 seed 类中调用 table() 方法来检索 Table 对象的实例,然后使用 insert() 方法来插入数据:
<?php
use Phinx\Seed\AbstractSeed;
class PostsSeeder extends AbstractSeed
{
public function run() : void
{
$data = [
[
'body' => 'foo',
'created' => date('Y-m-d H:i:s'),
],[
'body' => 'bar',
'created' => date('Y-m-d H:i:s'),
]
];
$posts = $this->table('posts');
$posts->insert($data)
->saveData();
}
}
你 必须 调用 saveData() 方法来将你的数据提交到表中。在此之前,Phinx 会缓冲数据。
清空表
除了插入数据,Phinx 还可以使用 SQL TRUNCATE 命令轻松地清空你的表:
<?php
use Phinx\Seed\AbstractSeed;
class UserSeeder extends AbstractSeed
{
public function run() : void
{
$data = [
[
'body' => 'foo',
'created' => date('Y-m-d H:i:s'),
],
[
'body' => 'bar',
'created' => date('Y-m-d H:i:s'),
]
];
$posts = $this->table('posts');
$posts->insert($data)
->saveData();
// 清空该表
$posts->truncate();
}
}
SQLite 原生不支持 TRUNCATE 命令,因此在底层使用的是 DELETE FROM。建议在清空表后调用 VACUUM 命令。Phinx 不会自动执行此操作。
执行 Seed 类
这是最简单的部分。要填充你的数据库,只需使用 seed:run 命令:
$ php vendor/bin/phinx seed:run
默认情况下,Phinx 将执行所有可用的 seed 类。如果你想运行一个特定的类,只需使用 -s 参数传入它的名称:
$ php vendor/bin/phinx seed:run -s UserSeeder
你也可以运行多个 seeder:
$ php vendor/bin/phinx seed:run -s UserSeeder -s PermissionSeeder -s LogSeeder
你还可以使用 -v 参数来获取更详细的输出信息:
$ php vendor/bin/phinx seed:run -v
Phinx 的 seed 功能提供了一个简单的机制,可以轻松地、可重复地将测试数据插入到你的数据库中。