首页 > 解决方案 > 如何使用 laravel 迁移交换两个索引字段?

问题描述

在多对多关系模型中,我意外地反向识别了外键名称。这是在两个相关模型中完成的,因此关系有效。它正在生产中。

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表中,两个值都记录在“错误”列中。

但是如果我想换掉它怎么办。模型很简单,但是数据透视表呢?我尝试过 laravel 迁移:

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'

将其拆分为 2 个迁移文件会遇到相同的错误。

我有顺其自然的倾向。问题是:能做到吗?我认为交换 MySQL 中的列没有迁移),重新索引表并调整模型是可能的。有任何想法吗?我可以在本地服务器上测试它。

标签: mysqllaravellaravel-5laravel-migrations

解决方案


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

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');
    });
}

推荐阅读