如何用laravel迁移交换两个索引字段?

xytpbqjk  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(637)

在多对多关系的模型中,我意外地用相反的方式标识了外键名。这是在两个相关的模型中完成的,因此关系是有效的。它正在生产中。
Articles :

public function categories()
{
    return $this->belongsToMany(ArticleCategory::class, 'article_category_article', 'article_category_id', 'article_id');
}

而且在 ArticleCategory :

public function articles()
{
    return $this->belongsToMany(Article::class, 'article_category_article', 'article_id', 'article_category_id');
}

如您所见,两个外键都是反向的。
它不困扰我,因为它贯穿整个项目。在 article_category_article 表两个值都记录在“错误”列中。
但如果我想交换呢。模型很简单,但是透视表呢?我尝试过一次拉维尔迁移:

public function up()
{
    Schema::table('article_category_article', function (Blueprint $table) {
        $table->renameColumn('article_id', 'temporarily');
        $table->renameColumn('article_category_id', 'article_id');
        $table->renameColumn('temporarily', 'article_category_id');
    });
}

如果没有成功,它会不出所料地陷入错误 There is no column with name 'temporarily' on table 'article_category_article' 将其拆分为两个迁移文件会遇到相同的错误。
我倾向于顺其自然。问题是:能做到吗?我假设在mysql中交换列(不迁移)、重新索引表和调整模型是可能的。有什么想法吗?我可以在本地服务器上测试。

bfnvny8b

bfnvny8b1#

两个独立的查询对我有用:

public function up()
{
    Schema::table('article_category_article', function (Blueprint $table) {
        $table->renameColumn('article_id', 'temporarily');
        $table->renameColumn('article_category_id', 'article_id');
    });
    Schema::table('article_category_article', function (Blueprint $table) {
        $table->renameColumn('temporarily', 'article_category_id');
    });
}

相关问题