3

我创建了以下迁移。它在我第一次运行时工作,但如果我对迁移进行更改 - 例如添加新列 - 当我运行phinx mingrate -c src/phinx-config.php时它不会更新数据库。

它似乎什么也没做。如果我从phinxlog数据库中删除条目并删除user表,它将重新创建表。否则,不会进行任何更改。

如果我从表中删除条目phinxlog并且不删除表,则会收到user表已存在的错误消息。我虽然这是这样做的目的,down()所以它可以放下桌子?

这是我的代码:

<?php

use \StudentApp\Migrations\Migration;

class AppMigration extends Migration
{
   public function up()
   {
       $this->schema->create('users', function(Illuminate\Database\Schema\Blueprint $table) {
           $table->increments('id');
           $table->string('firstname');
           $table->string('lastname');
           $table->string('email');
           $table->string('password');
           $table->string('token');
           $table->timestamp('token_expiry');
           $table->timestamps();
       });
   }

   public function down()
   {
       $this->schema->drop('users');
   }
}

任何想法为什么我重新运行时数据库没有更新migrate

4

1 回答 1

3

Phinx(和大多数其他迁移库)不会检查每个迁移是否有更改。Phinx 查看文件名开头的时间戳是否列在 phinxlog 表中,如果尚不存在,则 Phinx 将运行迁移。

因此,当您第一次运行迁移时,Phinx 会20161123122600_app_migration.php在您的迁移文件夹中找到,它将运行迁移的up方法并在那里应用更改。然后它将添加20161123122600到日志中。因为下次你运行时migrate,Phinx 会看到它20161123122600已经存在,它只会传递给下一个。

所有这一切的重点是,一旦您的迁移处于版本控制中,您就不应该更改迁移(其他人可能已经使用过它,并且如果他们签出迁移的新版本时会遇到与您相同的问题已经申请了)。最好的办法,尤其是在迁移已被推送或合并的情况下,是创建一个修改现有表的新迁移(并包括恢复更改的回滚)。

如果您尚未推送更改,那么您可以回滚您的迁移(这将调用该down方法),然后添加新列并重新运行迁移。然后,您应该压缩提交,以便人们无法签出未修改的迁移。总而言之,为这种变化创建新的迁移会更容易。

于 2018-03-20T00:43:10.733 回答