Laravel 调用工厂时记录被删除

Laravel record being deleted when calling Factory

我有两个 tables - 角色用户。在角色内部,我有一条记录。

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

奇怪的是,每当我调用我的用户工厂(它有字段 role_id 的外键)时,它都会删除角色 table 中的记录。它也无法创建工厂实例化,表示 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]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (app.users, CONSTRAINT users_role_id_foreign FOREIGN KEY (role_id) REFERENCES roles (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' => factory(Role::class)->create()->id,
 ];
});

PS 确保您的批量分配包括 role_id

虽然我无法弄清楚与此相关的确切问题,但我相信它与 PHPUnit 的数据库配置有关。我在 phpunit.xml 中添加了以下几行,解决了这个问题。

还值得一提的是,role 实体已被删除,因为测试使用的是 RefreshDatabase

    <env name="DB_CONNECTION" value="sqlite" />
    <env name="DB_DATABASE" value=":memory:" />