Laravel迁移外键取决于种子数据

时间:2015-01-17 22:42:35

标签: mysql laravel-4 database-migration seeding

我需要通过迁移和播种数据库来更新现有的Laravel应用程序。

我有一张如下表格:

  • ID
  • 名称

我想编辑数据库看起来像:

  • ID
  • 名称
  • type_id(新专栏)

类型(新表)

  • ID
  • 名称

type_id 类型表的非空外键。

类型表将在以下操作中使用Laravel播种机播种。每次应用程序更新后都会调用此播种器,并截断/重新插入一些仅随应用程序更新而更改的“静态”数据。对于本地/生产差异

,其配置方式与Laravel : Migrations & Seeding for production data类似

在本地数据库从头开始时,一切运行正常。但是在生产数据库上,已有很多记录。由于它是非空键,因此在推送到此数据库时实际迁移失败(实际上,该数据库的副本用于测试)

作为迁移解决方案,我想将第一个类型记录添加到每个现有的,但我无法在迁移过程中设置外键,因为项目表在此阶段为空,在播种前我不能将其留空,因为迁移不会通过。

我想到了一些事情:

  • 在整个更新期间禁用数据库上的外键检查,但我更喜欢一种解决方案,它允许我简单地将我的存储库推送到服务器并启动我的自动部署脚本(基本上称为artisan migrate,然后是artisan db :种子)
  • 在创建类型表后立即从迁移中调用播种机,但我不确定这是一个好习惯

我该怎么办?

编辑:这是我使用@lukasgeiter回答的工作迁移代码:

public function up()
{
    DB::statement('SET FOREIGN_KEY_CHECKS = 0');

    Schema::table('items', function(Blueprint $table)
    {
        $table->integer('type_id')->unsigned()->index()->after('name');
    });

    DB::update('update items set type_id = 1');

    Schema::table('items', function(Blueprint $table)
    {
        $table->foreign('type_id')->references('id')->on('types');

        // Here I do other stuff to this table
    });

    DB::statement('SET FOREIGN_KEY_CHECKS = 1');
}

1 个答案:

答案 0 :(得分:4)

您可以使用DB::statement和SQL来禁用迁移中的外键检查。

DB::statement('SET FOREIGN_KEY_CHECKS = 0');
// add column
DB::statement('SET FOREIGN_KEY_CHECKS = 1');