在 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。
希望对您有所帮助!
我正在尝试在 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。
希望对您有所帮助!