如何使用 Laravel 的 Seeder Factory 和特定数量的随机现有模型

问题描述 投票:0回答:1

我的问题与这个未回答的问题非常相似。

我正在 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 场比赛中随机分组(但也不会在同一场比赛中多次出现同一用户)。

我希望我所做的事情是有意义的!

laravel eloquent laravel-seeder
1个回答
0
投票

为什么每个游戏最终都会有相同的 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']);
});
© www.soinside.com 2019 - 2024. All rights reserved.