在 Laravel 5 中将一个工厂传递给另一个工厂

Passing a factory into another in Laravel 5

我正在尝试在 Laravel 上生成测试。 我想做的是创建一个虚构的职位名称,然后为该职位添加 10 个人。

PositionsFactory.php

$factory->define(App\Position::class, function (Faker $faker) {

    return [
            'p_id' => $faker->unique()->randomNumber($nbDigits = 8),
            'name' => $faker->word,
            'org' => $faker->word,
            'user_id' => 1
    ];
});

这是我的 EmployeeFactory.php

$factory->define(App\Employee::class, function (Faker $faker) {
    return [
        'FirstName' => $faker->name,
        'LastName' => $faker->lastName,
        'pid' => $position->p_id,
        'org'=> $position->org,
        'user_id' => 1,
    ];    
});

好吧,这是我的一个尝试,但它没有用

  for ($i=0; $i < 5; $i++ ){
            $position = factory('App\Position')->create();

                factory('App\Employee',10)->create(
                    'pid' => $position->pid,
                    'org' => $position->org
                );
        }

我尝试循环 5 次,每次循环我都想创建 10 名具有相同职位 ID 的员工。但显然我错过了一些东西。

我尝试在 Employee 工厂中添加 $position,效果很好。

$factory->define(App\Employee::class, function (Faker $faker) {
  $position = factory('App\Position')->create();
    return [
        'FirstName' => $faker->name,
        'LastName' => $faker->lastName,
        'pid' => $position->p_id,
        'org'=> $position->org,
        'user_id' => 1,
    ];

});

有没有办法制作类似的东西,

$factory('App\Position',5)->create($factory('App\Employee',10));

也许我错过了一些回电但有点迷路了。任何帮助,将不胜感激。谢谢!

您可以单独创建它们并循环遍历集合。

$positions = factory('App\Position', 3)->make();
foreach ($positions as $position){
    $employes = factory('App\Employee', 3)->make();
    foreach ($employes as $employee){
        $employee->p_id = $position->id;
        //etc.. watever you want to connect
    }
}

现在你有 1 个职位集合和 1 个职位划分后的雇员集合 请注意,make 方法不会保存到数据库中,您需要手动保存它们

您也可以按照文档中的说明更改工厂 https://laravel.com/docs/5.6/database-testing#using-factories

你的看起来像:

$factory->define(App\Employee::class, function (Faker $faker) {
    return [
        'FirstName' => $faker->name,
        'LastName' => $faker->lastName,
        'org'=> $position->org,
        'user_id' => 1,
        'pid' => function () {
             return factory('App\Position')->create()->id;
         }

    ];    
});

这将为工厂创建的每个用户创建一个职位。 如果您有现有职位,也可以使用现有的 eloquent 模型。

我想您可能正在寻找可以在 create:

之后调用的 each 方法
// Generate 5 positions and execute a callback
// function for each position created
factory(App\Position::class, 5)->create()->each(function ($position) {
    // In the callback, generate 10 employees
    // and manually override the foreign key
    factory(App\Employee::class, 10)->create([
        'pid' => $position->id
    ]);
});

有关 each 和处理关系的更多信息:https://laravel.com/docs/5.6/database-testing#relationships

希望对您有所帮助!