首页 > 解决方案 > laravel 数据库播种器添加随机添加外键 id 到种子

问题描述

我正在尝试为测试目的创建播种机。我有通过房间 ID 属于房间的用户,这些房间是通过房间播种器创建的,在我的用户播种器中,我创建一个用户并像这样更新 room_id 属性,

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

我的问题是这里生成的所有用户都获得相同的房间 ID,如何真正从数据库中获取随机房间 ID 并在我的播种器中使用它?

标签: phplaravellaravel-seeding

解决方案


我在播种时遇到了同样的问题。问题是,您通过传递“值”数组来覆盖工厂的默认模型属性。您正在将值传递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,
    ]);


推荐阅读