数据库播种

在 0.5.0 版本中,Phinx 引入了对使用测试数据播种数据库的支持。种子类是创建后轻松将数据库填充数据的绝佳方法。默认情况下,它们存储在 seeds 目录中;但是,此路径可以在您的配置文件中更改。

注意

数据库播种完全是可选的,Phinx 默认情况下不会创建 seeds 目录。

创建新的种子类

Phinx 包含一个命令来轻松生成新的种子类

$ php vendor/bin/phinx seed:create UserSeeder

如果您指定了多个种子路径,系统会要求您选择要创建新种子类的路径。

它基于骨架模板

<?php

use Phinx\Seed\AbstractSeed;

class MyNewSeeder extends AbstractSeed
{
    /**
     * Run Method.
     *
     * Write your database seeder using this method.
     *
     * More information on writing seeders is available here:
     * https://book.cakephp.com.cn/phinx/0/en/seeding.html
     */
    public function run() : void
    {

    }
}

AbstractSeed 类

所有 Phinx 种子都扩展自 AbstractSeed 类。此类提供创建种子类所需的必要支持。种子类主要用于插入测试数据。

Run 方法

当您执行 seed:run 命令时,Phinx 会自动调用 run 方法。您应该使用此方法来插入测试数据。

注意

与迁移不同,Phinx 不会跟踪已运行的种子类。这意味着可以重复运行数据库播种器。在开发它们时请牢记这一点。

Init 方法

如果存在 init() 方法,则 Phinx 会在 run 方法之前运行它。这可以用于在使用 run 之前初始化种子类的属性。

Should Execute 方法

Phinx 在执行种子之前运行 shouldExecute() 方法。这可以用来防止此时执行种子。默认情况下它始终返回 true。您可以在自定义的 AbstractSeed 实现中覆盖它。

外键依赖

通常您会发现播种器需要以特定的顺序运行,这样它们就不会违反外键约束。要定义此顺序,您可以实现返回要在此播种器之前运行的播种器数组的 getDependencies() 方法

<?php

use Phinx\Seed\AbstractSeed;

class ShoppingCartSeeder extends AbstractSeed
{
    public function getDependencies()
    {
        return [
            'UserSeeder',
            'ShopItemSeeder'
        ];
    }

    public function run() : void
    {
        // Seed the shopping cart  after the `UserSeeder` and
        // `ShopItemSeeder` have been run.
    }
}

注意

依赖项仅在执行所有种子类(默认行为)时才会被考虑。在运行特定种子类时,它们将不会被考虑。

插入数据

使用 Table 对象

种子类也可以使用熟悉的 Table 对象来插入数据。您可以通过在种子类中调用 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();

        // empty the table
        $posts->truncate();
    }
}

注意

SQLite 本身不支持 TRUNCATE 命令,因此在幕后使用的是 DELETE FROM。建议在截断表后调用 VACUUM 命令。Phinx 不会自动执行此操作。

执行种子类

这部分很容易。要播种您的数据库,只需使用 seed:run 命令

$ php vendor/bin/phinx seed:run

默认情况下,Phinx 会执行所有可用的种子类。如果您想运行特定的类,只需使用 -s 参数传递它的名称

$ php vendor/bin/phinx seed:run -s UserSeeder

您也可以运行多个播种器

$ php vendor/bin/phinx seed:run -s UserSeeder -s PermissionSeeder -s LogSeeder

您还可以使用 -v 参数获得更多输出详细程度

$ php vendor/bin/phinx seed:run -v

Phinx 种子功能提供了一种简单的机制来轻松且可重复地将测试数据插入您的数据库。