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

时间:2018-11-01 13:08:10

标签: mysql laravel laravel-5 laravel-migrations

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

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列(不进行迁移),重新索引表和适应模型是可能的。有任何想法吗?我可以在本地服务器上对其进行测试。

1 个答案:

答案 0 :(得分:0)

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

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