Я попытался заполнить мой файл сеялки, но я получаю эту ошибку - PullRequest
0 голосов
/ 23 апреля 2019

Я пытался выдать

$  php artisan db:seed

Заполнение: RoleSeeder

В строке Connection.php 664:

SQLSTATE [42000]: синтаксическая ошибка или доступнарушение: 1701 Невозможно усечь таблицу, на которую ссылается ограничение внешнего ключа (news. users, CONST RAINT users_role_id_foreign FOREIGN KEY (role_id) ССЫЛКИ news. roles (id)) (SQL: truncate roles)

Это мой файл Roleseeder.php

<?php

use Illuminate\Database\Seeder;

use App\Role ;

class RoleSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {

        Role::truncate();

        Role::create([
            'title'   => 'Students',
            'description' => 'Lorem ipsum dolor.'
        ]);

   // ....

Я не понимаю, почему я получаю эту ошибку ..

Iиметь этот файл миграции

Schema::table('users', function (Blueprint $table) {
    $table->integer('role_id')->unsigned()->after("id")->nullable();
    $table->foreign('role_id')
            ->references('id')->on('roles')
            ->onDelete('restrict');
});

1 Ответ

1 голос
/ 23 апреля 2019

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

Вместо этого вы можете использовать метод firstOrCreate(), который будет создавать значение, только если оно не существует.

public function run()
{
    Role::firstOrCreate([
            'title'   => 'Students',
            'description' => 'Lorem ipsum dolor.'
        ]);
}

В качестве альтернативы, если по какой-то причине вы хотите изменить описание каждого сеанса, вы можете использовать firstOrNew().

public function run()
{
    $role = Role::firstOrNew([
            'title'   => 'Students'
        ]);
    $role->description = 'Lorem ipsum dolor.';
    $role->save();
}

Кроме того, вы можете изменить отношение внешнего ключа, чтобы установить значение null, если оно будет удалено (обратите внимание, что при усечении вашего Roles все роли будут установлены на NULL).

->onDelete('set null');

Если вам действительно нужно усечь таблицу, вам сначала нужно очистить зависимые значения в таблице roles.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...