Laravel记录在调用Factory时被删除

时间:2019-01-08 06:03:02

标签: php mysql laravel pdo factory

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

{
  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无法添加或更新子行:外部   键约束失败(appusers,约束   users_role_id_foreign外键(role_id)参考roles   (id

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

您的外键验证似乎是您所说的错误所在。

在给定的上下文中,您的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

答案 1 :(得分:0)

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

还值得一提的是,由于测试使用的是 RefreshDatabase ,因此删除了角色实体。

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