移行を実行して(以下を参照)データベースをシードしようとしていますが、実行すると
php artisan migrate --seed
私はこのエラーを受け取ります:
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`
))
このエラーの意味を調べ、同じ問題に直面している他の人の examples を見つけました。これは MySQL の使用に関連している場合でも、その解決策ですが、申請中:
DB::statement('SET FOREIGN_KEY_CHECKS=0;'); and
DB::statement('SET FOREIGN_KEY_CHECKS=1;');
Down()内では機能しないようで、MySQLでdescribeを実行すると、テーブルは正しく見えます。
移行には適切な名前が付けられ、ユーザーテーブルが最初に移行され、次に外部キーを適用できるように車両が移行され、セットアップ中のテーブルで移行が実行されたことが正しく示されますが、エラーが発生します。 DBを削除して再作成し、再試行しましたが、同じ結果です。また、データベースの最初の移行とシードで切り捨てを試みる理由もわかりません。phpartisan 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');
}
エラーが言うように、外部キーによって参照されるテーブルを切り捨てることはできません。削除しても動作するはずです...
DB::table('some_table')->delete();
DB::statement('SET FOREIGN_KEY_CHECKS=0;');
App\User::truncate();
DB::statement('SET FOREIGN_KEY_CHECKS=1;');
そしてそれは動作します!
clear
を使用してtable
a Eloquent
へ:
Model::query()->delete();
デフォルトのユーザーモデルを使用した例
User::query()->delete();
あなたはこれを使用することができます
DB::statement('SET FOREIGN_KEY_CHECKS=0;');
App\User::truncate();
DB::statement('SET FOREIGN_KEY_CHECKS=1;');
これが毎回私にとってうまくいくものです。外部キーを追加するときは、必ずcascade
を追加してください。構文はこのようなものです
$table->foreign('column')->references('id')->on('table_name')->onDelete('cascade');
id
を適切なフィールドに置き換えてください。
シードを実行する前に、trucate
の代わりにこれを追加してください
DB::statement('DELETE FROM table_name');
すべてのデータが削除されます。お役に立てれば。
使用できます
DB::table('your_table_name')->delete();
テーブルを空にすると、テーブル構造は削除されません。ただし、自動インクリメントIDは初期番号から始まりません。