Фабрика/сеялка Laravel, создающая двойные записи, указана

У меня есть Users и UserProfiles.

Все Users имеют один и только один UserProfile.

Мой класс UserTableSeeder создает 25 записей и для каждой записи выводит UserProfile.

По какой-то причине я получаю двойное количество записей в Users и сумму, указанную в UserProfile. Таким образом, вставляется 50 Users и вставляется 25 UserProfiles.

Семя:

public function run()
    {
        factory(App\User::class, 25)->create()->each(function ($user) {
            $user->profile()->save(factory(App\UserProfile::class)->make());
        });
    }

Класс пользователя:

class User extends Model
{

    public function profile() {
        return $this->hasOne('App\UserProfile');
    }

}

Пользовательская фабрика:

$factory->define(User::class, function (Faker $faker) {
    return [
        'username' => $faker->userName(),
        'email' => $faker->unique()->safeEmail,
        'email_verified_at' => now(),
        'password' => '$2y$10$TKh8H1.PfQx37YgCzwiKb.KjNyWgaHb9cbcoQgdIVFlYg7B77UdFm', // secret
        'remember_token' => Str::random(10),
    ];
});

Фабрика профилей пользователей:

$factory->define(UserProfile::class, function (Faker $faker) {
    return [
        'user_id' => factory('App\User'::class)->create()->id,
        'bio' => $faker->paragraph()
    ];
});

Модель профиля пользователя:

class UserProfile extends Model
{
    public function user() {
        return $this->belongsTo('App\User');
    }
}

Моим ожидаемым результатом было 25 пользователей и таблица из 25 пользователей, поскольку у всех пользователей есть профиль.


person good_afternoon    schedule 11.05.2019    source источник


Ответы (1)


Изменить этот код

$factory->define(UserProfile::class, function (Faker $faker) {
    return [
        'user_id' => factory('App\User'::class)->create()->id,
        'bio' => $faker->paragraph()
    ];
});

To

$factory->define(UserProfile::class, function (Faker $faker) {
    return [
        'bio' => $faker->paragraph()
    ];
});
person Davit    schedule 11.05.2019