如何使用 Laravel 工厂进行唯一组合
How to do unique combinatorics with Laravel Factory
我正在尝试在 Laravel 中制作网页游戏,但在理解工厂文档方面遇到了一些困难。
是这样的情况,每个英雄可能有5个技能。但是英雄只会随机分配5个技能中的3个。
1,2,3
1,2,4
1,2,5
2,3,4
2,3,5
3,4,5
有没有办法让它创建这些独特的组合,而不是将工厂复制 6 次?
Hero::factory()->create([
'hero_class' => 'Warrior',
'attribute_health' => 100,
'attribute_attack' => 35,
'attribute_armor' => 75,
'attribute_speed' => 22,
'attribute_crit' => 15,
'skill_1' => 1,
'skill_2' => 1,
'skill_3' => 1,
]);
我在文档中看到你可以做序列
$users = User::factory()
->count(10)
->state(new Sequence(
['admin' => 'Y'],
['admin' => 'N'],
))
->create();
但是,如果我有更多的技能组合并且不想手动输入 50 个数组,是否有一些更动态的方法?
为了完成简单的连击,我不得不这样做
Hero::factory(5)
->state(new Sequence(
[ 'skill_1' => 1, 'skill_2' => 2, 'skill_3' => 3, ],
[ 'skill_1' => 1, 'skill_2' => 2, 'skill_3' => 4, ],
[ 'skill_1' => 1, 'skill_2' => 2, 'skill_3' => 5, ],
[ 'skill_1' => 2, 'skill_2' => 3, 'skill_3' => 4, ],
[ 'skill_1' => 2, 'skill_2' => 3, 'skill_3' => 5, ],
[ 'skill_1' => 3, 'skill_2' => 4, 'skill_3' => 5, ],
))
->create([
'hero_class' => 'Warrior',
'attribute_health' => 100,
'attribute_attack' => 35,
'attribute_armor' => 75,
'attribute_speed' => 22,
'attribute_crit' => 15,
]);
非常感谢任何有关如何解决此问题的见解;)
你可以做的是,首先在数组中创建一些随机的、独特的技能组合:
$skills = [];
do {
$randomSkillSet = [
'skill_1' => rand(1, 5),
'skill_2' => rand(1, 5),
'skill_3' => rand(1, 5)
];
if (!in_array($randomSkillSet, $skills)) {
$skills[] = $randomSkillSet;
}
} while (count($skills) < 50);
// We make sure 50 is less than 5^3 = 125
现在您可以在您的序列中将此数组与独特的技能组合一起使用,方法是从序列闭包中的 $skills
数组中取出每个项目,如下所示:
use Illuminate\Database\Eloquent\Factories\Sequence;
Hero::factory(50)
->state(new Sequence(
function ($sequence) use ($skills) {
return $skills[$sequence->index];
}
))
->create([
'hero_class' => 'Warrior',
'attribute_health' => 100,
'attribute_attack' => 35,
'attribute_armor' => 75,
'attribute_speed' => 22,
'attribute_crit' => 15,
]);
这是可能的,因为我们可以使用注入到闭包中的序列实例的索引 属性。
我正在尝试在 Laravel 中制作网页游戏,但在理解工厂文档方面遇到了一些困难。
是这样的情况,每个英雄可能有5个技能。但是英雄只会随机分配5个技能中的3个。
1,2,3
1,2,4
1,2,5
2,3,4
2,3,5
3,4,5
有没有办法让它创建这些独特的组合,而不是将工厂复制 6 次?
Hero::factory()->create([
'hero_class' => 'Warrior',
'attribute_health' => 100,
'attribute_attack' => 35,
'attribute_armor' => 75,
'attribute_speed' => 22,
'attribute_crit' => 15,
'skill_1' => 1,
'skill_2' => 1,
'skill_3' => 1,
]);
我在文档中看到你可以做序列
$users = User::factory()
->count(10)
->state(new Sequence(
['admin' => 'Y'],
['admin' => 'N'],
))
->create();
但是,如果我有更多的技能组合并且不想手动输入 50 个数组,是否有一些更动态的方法?
为了完成简单的连击,我不得不这样做
Hero::factory(5)
->state(new Sequence(
[ 'skill_1' => 1, 'skill_2' => 2, 'skill_3' => 3, ],
[ 'skill_1' => 1, 'skill_2' => 2, 'skill_3' => 4, ],
[ 'skill_1' => 1, 'skill_2' => 2, 'skill_3' => 5, ],
[ 'skill_1' => 2, 'skill_2' => 3, 'skill_3' => 4, ],
[ 'skill_1' => 2, 'skill_2' => 3, 'skill_3' => 5, ],
[ 'skill_1' => 3, 'skill_2' => 4, 'skill_3' => 5, ],
))
->create([
'hero_class' => 'Warrior',
'attribute_health' => 100,
'attribute_attack' => 35,
'attribute_armor' => 75,
'attribute_speed' => 22,
'attribute_crit' => 15,
]);
非常感谢任何有关如何解决此问题的见解;)
你可以做的是,首先在数组中创建一些随机的、独特的技能组合:
$skills = [];
do {
$randomSkillSet = [
'skill_1' => rand(1, 5),
'skill_2' => rand(1, 5),
'skill_3' => rand(1, 5)
];
if (!in_array($randomSkillSet, $skills)) {
$skills[] = $randomSkillSet;
}
} while (count($skills) < 50);
// We make sure 50 is less than 5^3 = 125
现在您可以在您的序列中将此数组与独特的技能组合一起使用,方法是从序列闭包中的 $skills
数组中取出每个项目,如下所示:
use Illuminate\Database\Eloquent\Factories\Sequence;
Hero::factory(50)
->state(new Sequence(
function ($sequence) use ($skills) {
return $skills[$sequence->index];
}
))
->create([
'hero_class' => 'Warrior',
'attribute_health' => 100,
'attribute_attack' => 35,
'attribute_armor' => 75,
'attribute_speed' => 22,
'attribute_crit' => 15,
]);
这是可能的,因为我们可以使用注入到闭包中的序列实例的索引 属性。