J'essaie de lancer la migration (voir ci-dessous) et d'amorcer la base de données, mais quand je lance
php artisan migrate --seed
Je reçois cette erreur:
Migration table created successfully.
Migrated: 2015_06_17_100000_create_users_table
Migrated: 2015_06_17_200000_create_password_resets_table
Migrated: 2015_06_17_300000_create_vehicles_table
[Illuminate\Database\QueryException]
SQLSTATE[42000]: Syntax error or access violation: 1701 Cannot truncate a table
referenced in a foreign key constraint (`app`.`vehicles`, CONSTRAINT `vehic
les_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `app`.`users` (`id`
)) (SQL: truncate `users`)
[PDOException]
SQLSTATE[42000]: Syntax error or access violation: 1701 Cannot truncate a table
referenced in a foreign key constraint (`app`.`vehicles`, CONSTRAINT `vehic
les_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `app`.`users` (`id`
))
J'ai cherché ce que cette erreur est supposée vouloir dire et ai également trouvé exemples d'autres personnes rencontrant le même problème, même juste liées à l'utilisation de MySQL , et à leurs solutions, mais en appliquant:
DB::statement('SET FOREIGN_KEY_CHECKS=0;'); and
DB::statement('SET FOREIGN_KEY_CHECKS=1;');
Dans down () ne semble pas fonctionner et lorsque je lance une description dans MySQL, les tables sont correctes.
Les migrations sont nommées correctement pour s'assurer que la table users est migrée en premier, puis les véhicules pour que la clé étrangère puisse être appliquée, et les tables en cours de configuration correctement suggèrent que les migrations ont été exécutées, mais ensuite l'erreur se produit. J'ai supprimé et recréé la base de données et l'ai réessayé. Le résultat est identique. Je ne comprends pas non plus pourquoi il essaie de tronquer la première migration et la première graine de la base de données. Je n'aurais pas pensé que cela se produirait si vous tentiez d'exécuter php artisan migrate: refresh --seed.
// 2015_06_17_100000_create_users_table.php
class CreateUsersTable extends Migration
{
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->increments('id');
$table->string('username', 60)->unique();
$table->string('email', 200)->unique();
$table->string('password', 255);
$table->string('role')->default('user');
$table->rememberToken();
$table->timestamps();
});
}
}
public function down()
{
Schema::drop('users');
}
// 2015_06_17_300000_create_vehicles_table.php
class CreateVehiclesTable extends Migration
{
public function up()
{
Schema::create('vehicles', function (Blueprint $table) {
$table->increments('id');
$table->integer('user_id')->unsigned();
$table->string('make');
$table->string('model');
$table->string('year');
$table->string('color');
$table->string('plate');
$table->timestamps();
$table->foreign('user_id')->references('id')->on('users');
});
}
}
public function down()
{
Schema::drop('vehicles');
}
Comme le dit l'erreur, vous ne pouvez pas tronquer les tables référencées par des clés étrangères. Supprimer devrait fonctionner si ...
DB::table('some_table')->delete();
DB::statement('SET FOREIGN_KEY_CHECKS=0;');
App\User::truncate();
DB::statement('SET FOREIGN_KEY_CHECKS=1;');
c'est du travail!
Pour clear
une table
en utilisant Eloquent
:
Model::query()->delete();
Exemple utilisant le modèle d'utilisateur par défaut
User::query()->delete();
Vous pouvez utiliser ça marche pour moi
DB::statement('SET FOREIGN_KEY_CHECKS=0;');
App\User::truncate();
DB::statement('SET FOREIGN_KEY_CHECKS=1;');
Voici ce qui fonctionne pour moi à chaque fois . Lorsque vous ajoutez la clé étrangère, veillez à ajouter cascade
. La syntaxe est la suivante:
$table->foreign('column')->references('id')->on('table_name')->onDelete('cascade');
Assurez-vous de remplacer id
par le champ qui vous convient.
Maintenant, avant d'exécuter l'ensemencement, ajoutez ceci au lieu de trucate
DB::statement('DELETE FROM table_name');
Il supprimera toutes les données . J'espère que cela vous aidera.
vous pouvez utiliser
DB::table('your_table_name')->delete();
pour vider une table, cela ne supprimera pas la structure de la table. Mais l'identifiant d'incrémentation automatique ne commencera pas à partir du numéro initial.