Laravel 数据库 Seeder:向种子数据随机添加外键 ID

3

我正在尝试创建用于测试的种子数据。 我有一个用户通过房间ID属于一个房间,这些房间是通过一个房间种子创建的,在我的用户种子中,我创建一个用户并像这样更新room_id属性:

factory(App\User::class, 150)->create([
        'host' => false,
        'room_id' =>  App\Room::inRandomOrder()->first()->id
    ]);

我的问题是这里生成的所有用户都拥有相同的房间ID,我该如何从数据库中获取一个真正随机的房间ID,并在我的数据填充器(seeder)中使用它?

App\Room::all()->random()->id 重复了吗?https://dev59.com/BmYr5IYBdhLWcg3wJ3CU - Big A
你可以使用rand从数据库中获取一个随机id。 - Andrei
@BigA并不是在问如何获取随机数,我在问为什么我的随机数不是真的随机,而是给每个创建的用户分配相同的ID,尽管有30多个ID可供选择。 - Udders
4个回答

1
我遇到了与种子数据相关的同样的问题。问题在于,您正在通过传递一个“值”数组来覆盖工厂的默认模型属性。您正在将App\Room::inRandomOrder()->first()->id的值传递给create方法。因此,您将拥有所有用户具有相同的room_id
要解决这个问题,在laravel 8中,您可以将'room_id' => Room::inRandomOrder()->first()->id移动到您的UsersFactory定义中:
class UsersFactory {
...

    public function definition()
    {
        return [
            'room_id' => Room::inRandomOrder()->first()->id
        ];
    }
...
}

像这样创建用户:
App\User::factory()->count(150)->create([
    'host' => false
]);

在较旧版本的Laravel中,将您的工厂定义如下:
$factory->define(App\User::class, function ($faker) use ($factory)  {
    return [
        'room_id' => Room::inRandomOrder()->first()->id
    ];
});

如下创建用户:
factory(App\User::class, 150)->create([
        'host' => false,
    ]);


0

尝试:

App\Room::all()->random()->id

0
/**
 * Run the database seeds.
 *
 * @return void
 */
public function run()
{
    $users = factory(\App\User::class, 150)->create([
        'host' => false,
        'room_id' => $this->getRandomRoomId()
    ]);
}

private function getRandomRoomId() {
    $room = \App\Room::inRandomOrder()->first();
    return $room->id;
}

试试这个。对我有效,希望对你也有效。


所有生成的150个用户都有相同的room_id。 - Udders
@udders 你的数据库里有超过1个房间吗? - Johannn
第一个运行的种子生成了30个房间。 - Udders
@UtkarshRaval 对我并没有太大帮助,因为在生成ID之前我不会知道它们的ID。 - Udders

0
试试这个。还要确保在房间表中有多个自动增量的房间条目。
$factory->define(App\User::class, function ($faker) use ($factory)  {
    return [
        'host' => false,
        'room_id' => $factory->create(App\Room::class)->id
    ];
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接