Сеялка базы данных laravel добавляет случайное добавление идентификатора внешнего ключа к семенам

Я пытаюсь создать сеялки для тестирования. У меня есть пользователи, которые принадлежат комнате через идентификатор комнаты, эти комнаты создаются с помощью сеялки комнаты, в моей сеялке пользователей я создаю пользователя и обновляю атрибут room_id следующим образом,

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

Моя проблема в том, что все пользователи, сгенерированные здесь, получают один и тот же идентификатор комнаты, как действительно получить случайный идентификатор комнаты из базы данных и использовать его в моем сеялке?


person Udders    schedule 15.10.2019    source источник
comment
comment
Вы можете использовать rand, чтобы получить случайный идентификатор из БД.   -  person Andrei    schedule 15.10.2019
comment
@BigA не спрашивает, как получить случайный, я спрашиваю, почему мой случайный не является случайным, а присваивает один и тот же идентификатор каждому созданному пользователю, даже если у него есть более 30 IDS на выбор.   -  person Udders    schedule 15.10.2019


Ответы (4)


У меня была такая же проблема с посевом. Проблема в том, что вы переопределяете атрибуты модели фабрики по умолчанию, передавая массив значений. Вы передаете значение 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,
    ]);

person amirz98    schedule 13.05.2021

Пытаться:

App\Room::all()->random()->id
person Johannn    schedule 15.10.2019

/**
 * 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;
}

Попробуй это. Меня устраивает. Надеюсь, это сработает для вас.

person Utkarsh Raval    schedule 15.10.2019
comment
Все 150 сгенерированных пользователей имеют одинаковый room_id. - person Udders; 15.10.2019
comment
@udders У вас есть более 1 комнаты в вашей базе данных? - person Johannn; 15.10.2019
comment
Первая сеялка сгенерирует 30 комнат. - person Udders; 15.10.2019
comment
@UtkarshRaval на самом деле мне не поможет, так как я не узнаю идентификаторы до того, как они будут сгенерированы. - person Udders; 15.10.2019

Попробуй это. Кроме того, убедитесь, что у вас есть несколько автоматически увеличивающихся записей комнат в таблице комнат.

$factory->define(App\User::class, function ($faker) use ($factory)  {
    return [
        'host' => false,
        'room_id' => $factory->create(App\Room::class)->id
    ];
});
person Utkarsh Raval    schedule 15.10.2019