Запись Laravel удаляется при вызове Factory - PullRequest
0 голосов
/ 08 января 2019

У меня есть две таблицы - Роли и Пользователи . Внутри ролей у меня есть одна запись.

{
  id: 1, name: Employee, timestamps: blahblah
}

Странно то, что всякий раз, когда я вызываю свою фабрику пользователей (которая имеет внешний ключ для поля role_id), она удаляет запись в таблице ролей. Также не удается создать экземпляр фабрики, сообщая, что ограничение внешнего ключа role_id не выполняется . Я понятия не имею, почему это происходит.

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

$factory->define(App\User::class, function (Faker $faker) {
 return [
    'name' => $faker->name,
    'email' => $faker->unique()->safeEmail,
    'email_verified_at' => now(),
    'password' => Hash::make("12341234"),
    'remember_token' => str_random(10),
    'company_id' => 1,
    'role_id' => 1,
 ];
});

И ошибка:

Doctrine \ DBAL \ Driver \ PDOException: SQLSTATE [23000]: целостность нарушение ограничения: 1452 Невозможно добавить или обновить дочернюю строку: чужая ключевое ограничение не выполнено (app. users, CONSTRAINT users_role_id_foreign ИНОСТРАННЫЙ КЛЮЧ (role_id) ССЫЛКИ roles (id))

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 09 января 2019

Хотя я не смог выяснить точную странность, связанную с этим, я считаю, что это связано с конфигурацией базы данных для PHPUnit. Я добавил следующие строки в свой phpunit.xml, который решил проблему.

Стоит также упомянуть, что сущность роль была удалена, поскольку в тесте использовалась RefreshDatabase .

    <env name="DB_CONNECTION" value="sqlite" />
    <env name="DB_DATABASE" value=":memory:" />
0 голосов
/ 08 января 2019

Проверка вашего внешнего ключа, по-видимому, связана с ошибкой.

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

Чтобы решить, вам нужно создать фабричный метод, который создает новую роль и выполнить следующее

$factory->define(App\User::class, function (Faker $faker) {
 return [
    'name' => $faker->name,
    'email' => $faker->unique()->safeEmail,
    'email_verified_at' => now(),
    'password' => Hash::make("12341234"),
    'remember_token' => str_random(10),
    'company_id' => 1,
    'role_id' => factory(Role::class)->create()->id,
 ];
});

PS убедитесь, что ваше массовое задание содержит role_id

...