首页 > 解决方案 > 使用faker防止laravel工厂中两个外键的重复条目

问题描述

我要实现一个这样的数据库:

表:

例如:我有唯一代码“k1”的商品,我有 3 家商店,例如:s1、s2、s3、now

我应该有这样的库存

我希望 k1 和 s1(外键)在库存表中创建一个新的复合键

避免重复的行,例如

k1,s1,250 或 k1,s2,100 或 k1,s3,45

换句话说,我不希望项目和商店的外键在数据透视表中重复超过 1 行“item_id 和 store_id 在库存表中构成唯一行”

我已经实现了,我现在的问题是:

使用 laravel 并使用带有 faker 的 Factory,我需要您的帮助来防止外键重复条目

这是我的工厂代码:

$factory->define(Item::class, function (Faker $faker) {
return [
    'code' => $faker->unique()->name,
    'cat_id' => Cat::all()->random()->id
];
});
$factory->define(Store::class, function (Faker $faker) {
return [
    'name' => $faker->unique()->name,
    'location' => $faker->address()

];
});


$factory->define(Inventory::class, function (Faker $faker) {
return [
    // now here i want to generate faked data with no duplicated rows using fks
    'item_id' => Item::all()->id,
    'store_id' => Store::all()->id

];
});

标签: phplaravelfaker

解决方案


稍微改变一下你的方法并做一些类似下面的事情怎么样(注意我没有测试代码给你我的 2 便士)

$factory->define(Inventory::class, function (Faker $faker) {
   return [
     'item_id' => function() {
        return factory(Item::class)->create()->id;
      },
     'store_id' => function() {
        return factory(Store::class)->create()->id;
      },
  ];

});


推荐阅读