ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

php – Laravel迁移禁用外键检查的好方法

2019-10-04 08:28:29  阅读:274  来源: 互联网

标签:php laravel migration


在进行laravel迁移时,我面临一些小小的不便.我使用Laravel 5.1.

由于存在许多具有许多关系的表,因此我可能无法重命名迁移文件,因此它们以正确的顺序运行,因此不会违反外键约束.这就是我过去做过的事情,而且非常不实用.

我现在正在做的是定义每个迁移,如下所示:

class CreateSomeTable extends Migration
{
    public function up()
    {
        DB::statement('SET FOREIGN_KEY_CHECKS=0;');
        // my table definitions go here
        DB::statement('SET FOREIGN_KEY_CHECKS=1;');
    }

    public function down()
    {
        DB::statement('SET FOREIGN_KEY_CHECKS=0;');
        // drop table
        DB::statement('SET FOREIGN_KEY_CHECKS=1;');
    }
}

这样做的问题在于它编写起来很繁琐,并且使代码变得混乱.

我还考虑过创建两个虚拟迁移文件,其唯一目的是启用和禁用外键检查,我会以这样的方式命名它们,它们将在每次迁移的开始和结束时运行.

如果有一个优雅的解决方案,也可以将它应用于播种过程,因为这也是一个问题.

这显然是一个非常即兴的解决方案,我想问是否有更好的方法.是否有一些beforeMigrate和afterMigrate方法,我可以覆盖或沿着这些线?

如果没有,你怎么去做呢?

任何见解都会受到赞赏,我不喜欢我所说的所有选项.

解决方法:

当Lumen / Laravel开始使用Passport时,我有一个类似的任务,我不得不放弃从lucadegasperi/oauth2-server-laravel开始的先前的oauth服务器实现.

我终于设法通过创建2个迁移来实现目标,其中第一个清除外键,第二个实际删除表.

我必须在Laravel’s Passport(2016-06-01)的迁移之前使用日期,因此它们将在这些之前执行.

2016_05_31_000000_clear_old_oauth_relations.php

//...
class ClearOldOauthRelations extends Migration
{
    public function up()
    {
        Schema::disableForeignKeyConstraints();
        // drop foreign keys
        Schema::table('oauth_access_tokens', function (BluePrint $table) {
            $table->dropForeign('oauth_access_tokens_session_id_foreign');
        });
        //...
        Schema::enableForeignKeyConstraints();
    }
    //...
}

并在第二个文件中
2016_05_31_000001_clear_old_oauth.php

//...
public function up()
{
    Schema::disableForeignKeyConstraints();
    Schema::drop('oauth_access_tokens');
    //...
    Schema::enableForeignKeyConstraints();
}
//...

标签:php,laravel,migration
来源: https://codeday.me/bug/20191004/1852510.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有