调用工厂时删除laravel记录

643ylb08  于 2021-06-15  发布在  Mysql
关注(0)|答案(2)|浏览(342)

我有两个表-角色和用户。在角色里面,我只有一张唱片。

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

奇怪的是,每当我调用我的用户工厂(它有一个字段role\ id的外键)时,它就会删除roles表中的记录。它还无法创建工厂示例化,表示role\u 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,
 ];
});

错误是:
条令\dbal\driver\pdoexception:sqlstate[23000]:完整性约束冲突:1452无法添加或更新子行:外键约束失败( app . users ,约束 users_role_id_foreign 外键( role_id )参考文献 roles ( id ))
任何帮助都将不胜感激。

j9per5c4

j9per5c41#

正如您所说的,外键验证似乎是问题所在。
给定的上下文中,您的角色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,
 ];
});

确保你的大规模分配包括角色\u id

lg40wkob

lg40wkob2#

虽然我无法找出与此相关的确切奇怪之处,但我相信这与phpunit的数据库配置有关。我在phpunit.xml中添加了以下行,解决了这个问题。
还值得一提的是,由于测试使用的是refreshdatabase,所以删除了角色实体。

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

相关问题