Laravel 5 laravel模型工厂种子从现有种子生成

Laravel 5 laravel模型工厂种子从现有种子生成,laravel-5,factory,laravel-seeding,Laravel 5,Factory,Laravel Seeding,我试图用一个外键为一个表种子,我一直在想如何告诉模型从已经存在的数据中随机抽取值 模型工厂 $factory->define(App\Vendor::class, function(Faker\Generator $faker) { return [ 'name' => $faker->company, ]; }); $factory->define(App\Device::class, function(Faker\Generator

我试图用一个外键为一个表种子,我一直在想如何告诉模型从已经存在的数据中随机抽取值

模型工厂

$factory->define(App\Vendor::class, function(Faker\Generator $faker) {
    return [
        'name' => $faker->company,
    ];
});

$factory->define(App\Device::class, function(Faker\Generator $faker) {
    return [
        'vendor' => ,
        'name' => $faker->company,
        'mac_address' => $faker->macAddress,
    ];
});
种子

可供出售的播种机

分步播种机

数据种子

我在设备表之前播种Vendor表,并希望从现有的vendors中填充一个随机的Vendor id

'vendor' => 'factory::App\Vendor'
但是我越来越

SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: foreign key constraint fails

看起来insert正在尝试将
factory::App\Vendor
作为Vendor列的字符串插入。我正在试图弄清楚如何从现有供应商那里获得它。

同时从
供应商可播种机
中播种它们

'vendor' => 'factory::App\Vendor'
您是否需要没有供应商的设备?还是没有设备的供应商?如果不是,那么这是最好的选择。相关的表应该放在一起

更好的例子是学校。学校是主要的种子,对于每一所学校,你也会播种一位校长,几位老师和100名学生。如果您一次对它们进行种子设定,那么就消除了对外键或顺序的担忧

工厂(应用程序\供应商::类,150)
->创建()
->每个功能(应用程序\供应商$Vendor){
$vendor->devices()->保存(
工厂(App\Device::class)->make()
);
//因为有些随机性
$vendor->devices()->保存(
工厂(App\Device::class,rand(0,4))->make()
);
});
如果您确实希望能够灵活地将它们单独播种,那么您还有几个其他选择。您可以在设备工厂内部随机选择一家供应商

$factory->define(App\Device::class,function)(Faker\Generator$Faker){
//随便找一个卖主
$vendor=App\vendor::orderByRaw('RAND()')->first();
//或者创建一个新的供应商
$vendor=factory(App\vendor::class)->create();
返回[
'vendor_id'=>$vendor->id,
“名称”=>$faker->company,
“mac_地址”=>$faker->macAddress,
];
});
也可以传递与工厂生成的属性合并的额外属性

/$vendor是一个vendor对象
工厂(应用\设备::类,50)->创建([
'vendor_id'=>$vendor->id,
]);

下面是我如何使用我的地址的,我使它在10%的时间内创建一个新地址,否则使用随机地址

// Grab a random address
$address = App\Address::orderByRaw('RAND()')->first();

// 10% that we will generate a new address
if ($faker->boolean(10) || !$address)
{
    $address = factory(App\Address::class)->create();
}

基本上我获取一个随机地址,如果它存在,
$faker->boolean(10)
将返回
true
,并生成一个新地址的概率为10%。但是,如果没有地址(
$address==false
),我们总是要生成一个新的地址。

下面是使用random()方法生成工厂的简单方法

SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: foreign key constraint fails
// Grab a random address
$address = App\Address::orderByRaw('RAND()')->first();

// 10% that we will generate a new address
if ($faker->boolean(10) || !$address)
{
    $address = factory(App\Address::class)->create();
}
$factory->define(App\Device::class, function(Faker\Generator $faker) {
    return [
        // another way to, Get any random row from existing records
        'vendor_id' => App\Vendor::all()->random()->user_id,
        'name'        => $faker->company,
        'mac_address' => $faker->macAddress,
    ];
});