有没有办法在任何“向下”函数触发时禁用外键约束?

问题描述 投票:0回答:1

我正在讨论一种在执行

Schema::disableForeignKeyConstraints()
命令时执行
artisan migrate:refresh
的有效方法。例如,我们可以将其集成到 down() 方法中的
migration
文件中。这是一个例子:

public function down()
{
    Schema::disableForeignKeyConstraints(); // Disable foreign key constraints
    Schema::dropIfExists('table'); // Delete the table
    Schema::enableForeignKeyConstraints(); // Re-enable foreign key constraints
}

是否有一个专为表删除而设计的事件,我们可以通过在

AppServiceProvider
中调用它来利用它?与将这两行添加到每个迁移文件相比,这将是一个更简化的解决方案。

提前致谢。

laravel database-migration laravel-migrations
1个回答
0
投票

您可以创建一个辅助函数来处理这个问题。然后,您可以在

down
方法中调用此辅助函数。

if (!function_exists('drop_table_with_fk')) {
    function drop_table_with_fk($table)
    {
        \Illuminate\Support\Facades\Schema::disableForeignKeyConstraints();
        \Illuminate\Support\Facades\Schema::dropIfExists($table);
        \Illuminate\Support\Facades\Schema::enableForeignKeyConstraints();
    }
}

您可以将此函数放置在

app/Helpers
目录中的新文件中(如果该目录不存在,您可能需要创建该目录)。然后,您可以通过将其添加到
composer.json
文件来自动加载该目录:

"autoload": {
    "files": [
        "app/Helpers/your_helper_file.php"
    ]
}

修改

composer.json
文件后,运行
composer dump-autoload
重新生成自动加载文件。现在,您可以在
drop_table_with_fk
方法中使用
down
函数。

public function down()
{
    drop_table_with_fk('table');
}
© www.soinside.com 2019 - 2024. All rights reserved.