如何在laravel中动态禁用和启用外键检查?

时间:2018-03-19 21:35:26

标签: php mysql laravel

我正在尝试使用更新的架构将条目从旧表移动到新表。问题是,我必须使用旧配置将10个表中的内容移动到具有新配置的10个表。

我是在console命令的帮助下完成的。当我添加新表并执行命令时,对于已经有明显数据的表,我得到重复输入错误。

当我尝试使用DB::connection('mysql_old')->table('users')->truncate();时,它会抛出1701 Cannot truncate a table referenced in a foreign key constraint错误,这也很明显!

以下是我将旧表格中的条目移动到新表格的方式。

$entries = DB::connection('mysql_old')->table('users')->get();
DB::table('users')->truncate();
foreach($entries as $entry){
    $user = \App\User::create([
        'name' => $entry->name,
        'email' => $entry->email,
        'status' => $entry->status,
        'credits' => $entry->credits,
        'role' => $entry->user_role,
        'email_subscription' => $entry->email_subscription,
        'activation_key' => $entry->activation_key,
        'password' => $entry->password,
        'remember_token' => $entry->remember_token,
        'created_at' => $entry->created_at,
        'updated_at' => $entry->updated_at
    ]);
}

唯一的解决方案是在截断之前禁用外键检查,并在截断后再次启用它(我认为)。它是一个关系数据库,显而易见。那么,有没有更好的方法来完成这项任务呢?

我考虑尝试将条目从旧表移到a relational way中的新表,但在这种情况下不可能。

每次执行命令时都可以执行命令php artisan migrate:refresh。但问题是,有超过25个表,完成migrate:refresh大约需要20-30秒。

我真的很困惑如何完成这件事。有没有正确或标准的方式?

3 个答案:

答案 0 :(得分:3)

试试这个:

Schema::disableForeignKeyConstraints();

// Your database operations go here..

Schema::enableForeignKeyConstraints();

答案 1 :(得分:0)

最后,我找到了关闭并打开外键检查的解决方案。以下是我将信息从旧表格移动到新表格的方式。

{{1}}

有效!

答案 2 :(得分:0)

如果您有迁移表,只需像这样为属性添加索引:

just make ->index
like this 
$table->unsignedBigInteger('city_id')->index();
 $table->foreign('city_id')->references('id')
 ->on('cities')->onDelete('cascade');