Kak*_*tus 3 mysql database-migration seeding laravel-4
我需要通过迁移和播种数据库来更新现有的 Laravel 应用程序。
我有一张如下表:
项目
我想编辑数据库看起来像:
项目
类型(新表)
随着TYPE_ID是一个非空的外键类型的表。
该类型的表将在接下来的操作中Laravel播种机播种。每次应用程序更新后都会调用此播种器,并截断/重新插入一些仅随应用程序更新而更改的“静态”数据。它的配置方式类似于Laravel : Migrations & Seeding for production data for the for the local/production差异
在本地数据库上从头开始时一切正常。但是在生产数据库上,已经有很多记录了。由于它是一个非空键,因此在推送到此数据库(实际上是该数据库的副本以供测试)时迁移失败
作为迁移解决方案,我想将第一个类型记录添加到每个现有项目,但我无法在迁移过程中设置外键,因为项目表在此阶段为空,并且在播种之前我不能将其留空,因为迁移没有通过。
我觉得有几点:
我该怎么办 ?
编辑:这是我使用@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');
}
Run Code Online (Sandbox Code Playgroud)
您可以使用DB::statementSQL禁用迁移内部的外键检查。
DB::statement('SET FOREIGN_KEY_CHECKS = 0');
// add column
DB::statement('SET FOREIGN_KEY_CHECKS = 1');
Run Code Online (Sandbox Code Playgroud)