Laravel 5.1 Migration and Seeding Невозможно обрезать таблицу, на которую ссылается ограничение внешнего ключа

Я пытаюсь выполнить миграцию (см. ниже) и засеять базу данных, но когда я запускаю

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`
))

Я искал, что должна означать эта ошибка, а также нашел примеры других людей, работающих в одной и той же проблеме, даже просто связанных с использованием MySQL и их решения, но применяя:

DB::statement('SET FOREIGN_KEY_CHECKS=0;'); and 
DB::statement('SET FOREIGN_KEY_CHECKS=1;'); 

В down(), похоже, не работает, и когда я запускаю описание в MySQL, таблицы выглядят правильно.

Миграции названы правильно, чтобы сначала перенести таблицу пользователей, а затем транспортные средства, чтобы внешний ключ мог быть применен, и правильно настроенные таблицы подсказывают, что миграции выполнялись, но затем возникает ошибка. Я бросил и воссоздал БД и снова попробовал, и это тот же результат. Я также не понимаю, почему он пытается усечь первую миграцию и семя базы данных, я бы не подумал, что это произойдет, когда вы попытаетесь запустить 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');
}

Ответ 1

Как говорится в ошибке, вы не можете обрезать таблицы, на которые ссылаются внешние ключи. Удалить должно работать, хотя...

DB::table('some_table')->delete();

Ответ 2

DB::statement('SET FOREIGN_KEY_CHECKS=0;');
App\User::truncate();
DB::statement('SET FOREIGN_KEY_CHECKS=1;');

И это работает!

Ответ 3

В clear a table с помощью Eloquent:

Model::query()->delete();

Пример использования модели пользователя по умолчанию

User::query()->delete();

Ответ 4

Вы можете использовать это, это работает для меня

DB::statement('SET FOREIGN_KEY_CHECKS=0;');
App\User::truncate();
DB::statement('SET FOREIGN_KEY_CHECKS=1;');

Ответ 5

Вот что работает для меня каждый раз. Когда вы добавляете внешний ключ, не забудьте добавить cascade. синтаксис подобен этому

$table->foreign('column')->references('id')->on('table_name')->onDelete('cascade');

Обязательно замените id на любое поле, которое применимо для вас.

Теперь перед запуском сеяния добавьте это вместо trucate

DB::statement('DELETE FROM table_name');

Он удалит все данные. Надеюсь, это поможет.

Ответ 6

вы можете использовать

DB::table('your_table_name')->delete();

чтобы удалить таблицу, это не приведет к удалению структуры таблицы. Но идентификатор автоматического увеличения не начинается с начального номера.