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

hrysbysz  于 2023-01-16  发布在  PHP
关注(0)|答案(3)|浏览(136)

我试图将条目从旧表移动到具有更新模式的新表。问题是,我必须将内容从具有旧配置的10个表移动到具有新配置的10个表。
我是在控制台命令的帮助下做这件事的。当我添加新表并执行命令时,我得到了已经有数据的表的重复条目错误,这是显而易见的。
当我尝试使用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秒。
我真的不知道该怎么做。有什么合适或标准的方法吗?

suzh9iv8

suzh9iv81#

您可以执行以下操作:

Schema::disableForeignKeyConstraints();

// Your database operations go here..

Schema::enableForeignKeyConstraints();
nwsw7zdq

nwsw7zdq2#

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

// Disable foreign key checks!
DB::statement('SET FOREIGN_KEY_CHECKS=0;');

// Move users from old table to the new one
$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
    ]);
}

// Enable foreign key checks!
DB::statement('SET FOREIGN_KEY_CHECKS=1;');

成功了!

tv6aics1

tv6aics13#

如果您有迁移表,只需按如下方式为属性创建索引:

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

相关问题