Я пытаюсь отменить мои миграции.
В моем файле миграции используются внешние ключи
$table->foreign('user_one')->references('id')->on('users');
$table->foreign('user_two')->references('id')->on('users');
Функция my down() похожа на
public function down()
{
Schema::drop('pm_convo');
Schema::drop('pm_convo_replys');
}
Когда я запускаю команду migrate
php artisan migrate:refresh --seed --env=local
Я получаю следующую ошибку
SQLSTATE[23000]: Integrity constraint violation: 1217 Cannot delete or update a parent row: a foreign key constraint fails (SQL: drop table `pm_convo`)
Im не совсем уверен, что делать, чтобы исправить это.
Edit:
Я пробовал: $table->dropForeign('pm_convo_user_one_foreign');
Но я получаю ошибки с этим также
pm_convo_replys
имеет внешний ключ, который ссылается на pm_convo
, поэтому вы не можете удалить pm_convo
сначала, не нарушая ограничение внешнего ключа в pm_convo_replys
.
Для удаления обоих вам необходимо удалить pm_convo_replys
сначала.
public function down()
{
Schema::drop('pm_convo_replys');
Schema::drop('pm_convo');
}
Я думаю, что это лучший способ сделать это:
public function down()
{
DB::statement('SET FOREIGN_KEY_CHECKS = 0');
Schema::dropIfExists('tableName');
DB::statement('SET FOREIGN_KEY_CHECKS = 1');
}
Я также столкнулся с такими проблемами. Перенос файла миграции здесь является основной проблемой. Лучший способ - создать файлы миграции один за другим. Сначала должны создаваться основные объекты. Миграция должна обновляться при каждом создании файла миграции. (с php artisan migrate:refresh
)
Согласно @abkrim и @Eric
public function down()
{
Schema::disableForeignKeyConstraints();
Schema::drop('tableName');
Schema::enableForeignKeyConstraints();
}
DB::statement('SET FOREIGN_KEY_CHECKS = 0');
код, чем DB::statement('SET FOREIGN_KEY_CHECKS = 0');
Я думаю, что это самый правильный подход:
public function down()
{
Schema::table('[table]', function (Blueprint $table) {
$table->dropForeign('[table]_[column]_foreign');
$table->dropColumn('[column]');
});
}
предпочитают делать это таким образом
Schema::dropIfExists('tableNameChild');
Schema::drop('tableNameParents');
Вы можете сделать это очень легко, если вы добавили cascade
на foeign key
при создании таблицы. Если вы это сделаете, вы можете легко удалить таблицу без чего-то подобного для PostgreSQL.
DB::statement("drop table tableName if exists cascade");
Все, что вам нужно сделать, это поместить инструкцию для таблицы SQL в необработанный формат.
Важно, это для Laravel 5.4.
Согласно документам
Чтобы удалить внешний ключ, вы можете использовать метод dropForeign. Ограничения внешнего ключа используют одно и то же соглашение об именах как индексы. Таким образом, мы будем конкатенировать имя таблицы и столбцы в ограничении, а затем суффикс имени с помощью "_foreign"
$table->dropForeign('posts_user_id_foreign');
Или вы можете передать значение массива, которое автоматически будет использовать традиционное имя ограничения при удалении:
$table->dropForeign(['user_id']);
Я лично предпочитаю второй из-за простоты
pm_convo
?