Как поменять местами два проиндексированных поля с миграциями 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 (без миграции), переиндексировать таблицы и адаптировать модели. Есть идеи? Я могу проверить это на локальном сервере.

1 ответ

У меня работают два отдельных запроса:

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');
    });
}
Другие вопросы по тегам