如何使用 phinx 编写迁移以插入记录


How can I write migrations to insert records using phinx?

我正在使用phinx来处理新项目的迁移,现在我需要创建一个新表并向其插入一些行,我有:

$tableStatus = $this->table('status');
$tableStatus->addColumn('code', 'string');
$tableStatus->addColumn('description', 'string');
$tableStatus->save();

这添加了新表,但我在文档中找不到如何插入行,但似乎有可能:

AbstractMigration 类 所有 Phinx 迁移都从 抽象迁移类。此类提供必要的支持 创建数据库迁移。数据库迁移可以转换 您的数据库以多种方式,例如创建新表、插入 行,添加索引和修改列。

可能吗?我该怎么做?

正如 igrossiter 指出的那样,有一个方法可以做到这一点,该方法的名称是 insert

use Phinx'Migration'AbstractMigration;
class NewStatus extends AbstractMigration
{
    protected $statusId = 1234; //It'd be nice to use an entity constant instead of magic numbers, but that's up to you.
    protected $statusName = 'In Progress';
    /**
    * Migrate Up.
    */
    public function up()
    {
        $columns = ['id', 'name'];
        $data = [[$this->statusId, $this->statusName]];
        $table = $this->table('status');
        $table->insert($columns, $data);
        $table->saveData();   
    }
    /**
    * Migrate Down.
    */
    public function down()
    {
        $this->execute('Delete from status where id = ' . $this->statusId);
    }
}

编辑截至2015年12月2日

此方法的签名将在将来的稳定版本中更改为类似

$data = [
    ['id' => 1, 'name' => 'foo'],
    ['id' => 2, 'name' => 'bar']
];
$table = $this->table('status');
$table->insert($data);

更多信息在这里

你可以做到。有关详细信息,请阅读文档。

http://docs.phinx.org/en/latest/migrations.html#executing-queries

use Phinx'Migration'AbstractMigration;
class MyNewMigration extends AbstractMigration
{
    /**
    * Migrate Up.
    */
    public function up()
    {
        // execute()
        $count = $this->execute('insert into users(id, name) values (5, "john")'); 
    }
    /**
     * Migrate Down.
     */
    public function down()
    {
    }
}
  1. 运行以下命令以生成 StatusMigration 类:
php vendor/bin/phinx create StatusMigration
  1. 编辑该文件,如下所示:
<?php
use Phinx'Migration'AbstractMigration;
class StatusMigration extends AbstractMigration
{
    public function change()
    {
        $this->table('status')
            ->addColumn('code', 'string')
            ->addColumn('description', 'string')
            ->create();
    }
}
  1. 您可以使用 Phinx 的数据库种子机制将行插入表中。首先运行以下命令:
php vendor/bin/phinx seed:create StatusSeeder

它将在Phinx的seeds文件夹中生成StatusSeeder.php文件。

  1. 编辑状态Seader.php例如:

use Phinx'Seed'AbstractSeed;
class StatusSeeder extends AbstractSeed
{
    public function run()
    {
        $data = [
            ['code' => 'c1', 'description' => 'Some description'],
            ['code' => 'c2', 'description' => 'Another description'],
        ];
        $this->table('status')
            ->insert($data)
            ->save();
    }
}
  1. 现在,运行以下命令以创建表和种子数据:
php vendor/bin/phinx migrate
php vendor/bin/phinx seed:run
这个问题

使用CakePHP 3的迁移插件有一个很好的答案:

public function up() {
    // Save records to the newly created schema
    $UsersTable = TableRegistry::get('Users');
    $user = $UsersTable->newEntity();
    $user->name = 'Joe Bloggs';
    $user->email = 'joe@example.com';
    $UsersTable->save($user);
}