将工厂转移到Laravel 5中的另一个工厂

时间:2018-08-20 13:01:19

标签: php laravel-5 faker

我正在尝试对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));

也许我错过了一些回电服务,但有些失落。任何帮助,将不胜感激。谢谢!

2 个答案:

答案 0 :(得分:1)

我认为您可能正在寻找each之后可以调用的create方法:

// 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

希望有帮助!

答案 1 :(得分:0)

您可以分别创建它们并遍历集合。

$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;
         }

    ];    
});

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