Не удается усечь таблицу перед заполнением

#php #laravel #laravel-5 #eloquent #lumen

#php #laravel #laravel-5 #красноречивый #lumen

Вопрос:

Я хочу усечь свою пользовательскую таблицу перед заполнением.мне нравится это :

DatabaseSeeder.php :

  <?php

 use IlluminateDatabaseSeeder;
 use IlluminateSupportFacadesDB;

 class DatabaseSeeder extends Seeder
 {
     public function run()
     {
         AppUser::truncate();

         factory(AppUser::class,1)->create();
     }
 }
  

Затем запустите php artisan db:seed и получите ошибку:

 In Connection.php line 664:

  SQLSTATE[42000]: Syntax error or access violation: 1701 Cannot truncate a table referenced in a foreign key constra
  int (`mr_musicer`.`dislikes`, CONSTRAINT `dislikes_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `mr_musicer`
  .`users` (`id`)) (SQL: truncate `users`)


In Connection.php line 458:

  SQLSTATE[42000]: Syntax error or access violation: 1701 Cannot truncate a table referenced in a foreign key constra
  int (`mr_musicer`.`dislikes`, CONSTRAINT `dislikes_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `mr_musicer`
  .`users` (`id`))
  

Теперь я хочу объяснить, почему я не могу усечь свою пользовательскую таблицу!

Ответ №1:

Существует проблема с внешним ключом, и table пытается напомнить вам об этом. Если вы все равно хотите усечь таблицу.

     Schema::disableForeignKeyConstraints();

    // ... Some Truncate Query

    Schema::enableForeignKeyConstraints();
  

Не забудьте использовать:
use IlluminateSupportFacadesSchema;

Ответ №2:

Импорт DB :

 use IlluminateSupportFacadesDB;
  

А затем используйте этот фрагмент кода для усечения таблицы:

 DB::statement('SET FOREIGN_KEY_CHECKS=0;');
DB::table('posts')->truncate();
DB::statement('SET FOREIGN_KEY_CHECKS=1;');
  

Ответ №3:

Самый простой способ усечь данные перед заполнением, когда у вас есть внешние ключи в таблице

Просто добавьте эту единственную строку в начале вашего метода запуска.

 Schema::disableForeignKeyConstraints();

DB::truncate('posts'); or Post::truncate();

Schema::enableForeignKeyConstraints();
  

Комментарии:

1. Я думаю, что это ошибка, сначала вы должны использовать disableForeignKeyConstraints, а после ваших операций вызвать enableForeignKeyConstraints.

Ответ №4:

У вас есть ссылки на ваших пользователей в какой-то другой таблице. Вы должны добавить ->onDelete('cascade') в столбец таблицы «Не нравится», который ссылается на идентификатор пользователя, или сначала удалить все «не нравится» вручную.

 $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
  

Комментарии:

1. я использовал cascade во всех таблицах, подобных этой : $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade')->onUpdate('cascade');