我的问题与这个未回答的问题非常相似。
我正在 Laravel 11 中制作一个 2v2 天梯系统。我有 2 个型号:
它们之间有一个数据透视表,其中添加了
team_user
列,定义用户所在的团队。
用户可以无限次玩游戏,但一场游戏只有 4 名玩家,而他们在该游戏中的队伍由上述枢轴列定义。
我的播种机功能目前如下所示:
$users = User::factory(20)->create();
Game::factory(100)
->hasAttached($users->random(2), [
'user_team' => 'team1'
])
->hasAttached($users->random(2), [
'user_team' => 'team2'
])
->create();
这有点管用。创建了 20 个用户和 100 个游戏,但每个游戏都使用相同的 4 个用户。
如果我将
User::factory()
直接插入 hasAttached()
,它将为每个游戏生成新用户。
我想要的是 20 个用户在所有 100 场比赛中随机分组(但也不会在同一场比赛中多次出现同一用户)。
我希望我所做的事情是有意义的!
为什么每个游戏最终都会有相同的 4 个用户? 因为 Laravel 工厂仅运行一次 hasAttach 方法的两次调用,并将它们应用于整个集合,而不是在每个游戏中运行它们
你可以试试这个
$users = User::factory(20)->create();
Game::factory(100)->create()->each(function ($game) use ($users) {
// Shuffle users for random selection
$shuffledUsers = $users->shuffle();
// Assign two users to team1 and two users to team2
[$team1Users, $team2Users] = $shuffledUsers->chunk(2);
// Attach users to the game with their respective teams
$game->users()->attach($team1Users, ['user_team' => 'team1']);
$game->users()->attach($team2Users, ['user_team' => 'team2']);
});