Laravel 根据种子数据迁移外键
Laravel migration foreign key depending on seed data
我需要通过迁移和播种数据库来更新现有的 Laravel 应用程序。
我有一个 table 如下所示:
项
- id
- 名字
我想将数据库编辑为:
项
- id
- 名字
- type_id(新列)
类型(新table)
- id
- 名字
type_id 是 类型 table 的 not-null 外键。
类型 table 将在接下来的操作中使用 Laravel 播种器进行播种。每次应用程序更新和 truncate/reinsert 一些 "static" 仅随应用程序更新而变化的数据后,将调用此播种器。对于 local/production 差异
,它的配置方式类似于 Laravel : Migrations & Seeding for production data
在本地数据库上从头开始一切都运行良好。但是在生产数据库上,已经有很多记录了。由于它是一个 not-null 密钥,因此在推送到此数据库时迁移失败(实际上,该数据库的副本用于测试)
作为迁移解决方案,我想将第一个 type 记录添加到每个现有的 item,但我无法设置迁移期间的外键,因为 items table 在这个阶段是空的,我不能在播种之前将其留空,因为迁移没有通过。
有些事情我想:
- 在整个更新期间禁用对数据库的外键检查,但我更喜欢一种允许我简单地将我的存储库推送到服务器并启动我的自动部署脚本(本质上调用 artisan 迁移后跟 artisan db:seed).
- 在创建 类型 table 后立即从迁移中调用播种机,但我不确定这是一个好的做法
我该怎么办?
编辑:这是我使用@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');
}
您可以使用 DB::statement
和 SQL 在迁移中禁用外键检查。
DB::statement('SET FOREIGN_KEY_CHECKS = 0');
// add column
DB::statement('SET FOREIGN_KEY_CHECKS = 1');
我需要通过迁移和播种数据库来更新现有的 Laravel 应用程序。
我有一个 table 如下所示:
项
- id
- 名字
我想将数据库编辑为:
项
- id
- 名字
- type_id(新列)
类型(新table)
- id
- 名字
type_id 是 类型 table 的 not-null 外键。
类型 table 将在接下来的操作中使用 Laravel 播种器进行播种。每次应用程序更新和 truncate/reinsert 一些 "static" 仅随应用程序更新而变化的数据后,将调用此播种器。对于 local/production 差异
,它的配置方式类似于 Laravel : Migrations & Seeding for production data在本地数据库上从头开始一切都运行良好。但是在生产数据库上,已经有很多记录了。由于它是一个 not-null 密钥,因此在推送到此数据库时迁移失败(实际上,该数据库的副本用于测试)
作为迁移解决方案,我想将第一个 type 记录添加到每个现有的 item,但我无法设置迁移期间的外键,因为 items table 在这个阶段是空的,我不能在播种之前将其留空,因为迁移没有通过。
有些事情我想:
- 在整个更新期间禁用对数据库的外键检查,但我更喜欢一种允许我简单地将我的存储库推送到服务器并启动我的自动部署脚本(本质上调用 artisan 迁移后跟 artisan db:seed).
- 在创建 类型 table 后立即从迁移中调用播种机,但我不确定这是一个好的做法
我该怎么办?
编辑:这是我使用@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');
}
您可以使用 DB::statement
和 SQL 在迁移中禁用外键检查。
DB::statement('SET FOREIGN_KEY_CHECKS = 0');
// add column
DB::statement('SET FOREIGN_KEY_CHECKS = 1');