Как я могу поддерживать внешние ключи при заполнении базы данных с помощью Faker?

Ниже моя фабрика моделей.

$factory->define(App\Business::class, function (Faker\Generator $faker){
return [
'name' => $faker->bs,
'slug' => $faker->slug,
'address' => $faker->streetAddress,
'phone_no' => $faker->phoneNumber,
'mobile_no' => $faker->phoneNumber,
'email' => $faker->companyEmail,
'website' => $faker->domainName,
'latitude' => $faker->latitude,
'longitude' => $faker->longitude,
'location' => $faker->city,
'business_days_from' => $faker->dayOfWeek,
'business_days_to' => $faker->dayOfWeek,
'description' => $faker->text,
'user_id' => $faker->factory(App\User::class),
];

});

и это мой класс сеялки базы данных

class DatabaseSeeder extends Seeder
{
    public function run()
    {
        factory(App\Business::class, 300)->create();
    }
}

Но когда я запускаю php artisan db:seed... это не работает...

Каким должен быть обходной путь здесь... любая помощь будет оценена...


person Raihan Mahmud    schedule 27.01.2016    source источник
comment
Ошибка вообще? Вы пробовали сбросить результат создания фабрики?   -  person Mark Davidson    schedule 27.01.2016
comment
Да, я сделал, и он сказал [InvalidArgumentException] Неизвестная фабрика форматирования @MarkDavidson   -  person Raihan Mahmud    schedule 27.01.2016
comment
Ах я вижу. Посмотрите документацию laravel.com/docs/5.2/testing#model-factories раздел «Добавление отношений к моделям» должен помочь вам выполнить то, что вы ищете.   -  person Mark Davidson    schedule 28.01.2016


Ответы (2)


вы можете получить все идентификаторы, используя pluck (lists устарело для laravel >= 5.2)

$userIds = User::all()->pluck('id')->toArray();

и получить случайный идентификатор для столбца FK:

'user_id' => $faker->randomElement($userIds) 

Вы также можете прикрепить отношения к моделям, используя атрибуты Closure в определениях фабрики.

    'title' => $faker->title,
    'content' => $faker->paragraph,
    'user_id' => function () {
        return factory(App\User::class)->create()->id;
    }
person Ali Sherafat    schedule 04.02.2017

Я только что нашел обходной путь. Я заменил

'user_id' => $faker->factory(App\User::class),

с

'user_id' => $faker->randomElement(User::lists('id')->toArray()),

и это решает проблему на данный момент ..

person Raihan Mahmud    schedule 28.01.2016
comment
проснулся для меня, использовал pluck() вместо lists() 'user_id' => $faker->randomElement(User::pluck('id')->toArray()), - person ; 20.08.2017