Как поменять местами два проиндексированных поля с миграциями 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');
});
}