【发布时间】:2015-03-16 07:24:48
【问题描述】:
我需要通过迁移和植入数据库来更新现有的 Laravel 应用程序。
我有一张如下表:
项目
- 身份证
- 姓名
我想将数据库编辑成如下所示:
项目
- 身份证
- 姓名
- type_id(新列)
类型(新表)
- 身份证
- 姓名
type_id 是 types 表的非空外键。
types 表将在以下操作中使用 Laravel 播种器播种。这个播种器将在每次应用程序更新后被调用,并截断/重新插入一些“静态”数据,这些数据只会随着应用程序的更新而改变。它的配置方式类似于Laravel : Migrations & Seeding for production data,用于本地/生产差异
在本地数据库上从头开始时一切正常。但是在生产数据库上,已经有很多记录了。由于是非空键,所以推送到这个数据库时迁移失败(实际上是那个数据库的副本用于测试)
作为迁移解决方案,我想将第一个 type 记录添加到每个现有 item 中,但我无法在迁移期间设置外键,因为items 表在这个阶段是空的,在播种之前我不能让它空着,因为迁移没有通过。
有些事情我想:
- 在整个更新过程中禁用对数据库的外键检查,但我更喜欢一种解决方案,它允许我简单地将我的存储库推送到服务器并启动我的自动部署脚本(本质上调用 artisan migrate 后跟 artisan db :种子)。
- 在创建 types 表后立即从迁移中调用播种器,但我不确定这是一个好习惯
我该怎么办?
编辑:这是我使用@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');
}
【问题讨论】:
标签: mysql laravel-4 database-migration seeding