Посев с связанными отношениями в Laravel 5.7 - PullRequest
0 голосов
/ 27 декабря 2018

У меня есть модели User, Company и BusinessUnit, я уже создал отношения, и я хочу выполнить заполнение базы данных с использованием фабрики моделей с таким условием:

  1. Каждый пользователь имеет одну компанию
  2. Каждая Компания принадлежит Пользователю и имеет множество BusinessUnit
  3. Каждый BusinessUnit принадлежит Компании

Я создал этот код для заполнения Companyи он работает

factory(App\User::class, 5)->create()->each(function ($user) {
    $user->company()->saveMany(
        factory(App\Company::class, 5)->make()
    );
});

Но когда я пытаюсь добавить BusinessUnit вот так:

factory(App\User::class, 5)->create()->each(function ($user) {
    $user->company()->saveMany(
        factory(App\Company::class, 5)->make()->each(function ($company) {
            $company->businessUnit()->saveMany(
                factory(App\BusinessUnit::class, 50)->make()
            );
        })
    );
});

Я получаю эту ошибку:

SQLSTATE [23000]: Нарушение ограничения целостности: 1048 Столбец 'company_id' не может быть пустым (SQL: вставить в business_units (icon, name, description, address, company_id, updated_at, created_at) значения (//via.placeholder.com/150, Aspernatur consectetur quia vitae., Odio natus et eaque aut neque. Corrupti illo optio aut quas reiciendis est. Officiis doloribus vitae aliquam cupiditate dolor., 4300 Bartell Fords Elijahton, TX7562, 2018-12-27 11:24:42, 2018-12-27 11:24:42))

IsЕсть ли правильный способ сделать это?Я уже прочитал документацию, но до сих пор не имею понятия об этом.Пожалуйста, помогите.

1 Ответ

0 голосов
/ 27 декабря 2018

Компании должны быть созданы до назначения бизнес-единиц.В своем коде вы не создаете компании, а просто создаете массив объектов компании и пытаетесь связать с ними бизнес-единицы.

Попробуйте это,

factory(App\User::class, 5)->create()->each(function ($user) {
    $user->company()->saveMany(
        factory(App\Company::class, 5)->create(['user_id' => $user->id])->each(function ($company) {
            $company->businessUnit()->saveMany(
                factory(App\BusinessUnit::class, 50)->make()
            );
        })
    );
});
...