Отношения фабрики многоуровневых моделей в Laravel 5.4

Я пытаюсь настроить фабрику моделей в Laravel 5.4 со следующими отношениями:

Фонд
----- Подписка
----------- Подписчик

У каждого фонда есть много подписок, и у каждого подписчика также есть много подписок. Подписки принадлежат Фонду, а также подписчику.

Я пытаюсь настроить фабрику моделей в Laravel (Eloquent), чтобы выполнить эти отношения в одном сеялке. Вот что у меня есть на данный момент:

Приложение \ Фонд

public function subscriptions()
{
    return $this->hasMany('App\Subscription');
}

public function subscribers()
{
    return $this->hasMany('App\Subscriber');
}

Приложение \ Подписка

public function subscriber()
{
    return $this->belongsTo('App\Subscriber');
}

public function fund()
{
    return $this->belongsTo('App\Fund');
}

Приложение \ подписчик

public function subscriptions()
{
    return $this->hasMany('App\Subscription');
}

Завод для \ App \ Fund

$factory->define(App\Fund::class, function (Faker\Generator $faker) {
return [
    'code' => strtoupper($faker->lexify('?????')).$faker->numberBetween('10000', '99999'),
    'name' => $faker->text('45'),
    'status' => 'Active',
    'currency' => $faker->currencyCode(),
    'location' => $faker->country(),
    'redeemable' => $faker->boolean(50),
    'interest_rate' => $faker->randomFloat(2, 0, 0.99),
    'interest_frequency' => 'Quarterly',
    'management_fee' => $faker->randomFloat(2, 0, 0.99),
    'inclusion_rate' => $faker->randomFloat(2, 0, 0.99),
    'notes' => $faker->sentences(6, TRUE),
];
});

Завод для \ App \ Subscription

$factory->define(App\Subscription::class, function (Faker\Generator $faker) {
return [
    'code' => $faker->numberBetween('10000', '99999'),
    'amount' => $faker->randomFloat(2, 2000, 18000),
    'purchase_price' => $faker->randomFloat(2, 5, 25),
    'qty_purchased' => $faker->randomFloat(4, 1000, 20000),
    'date' => date("Y-m-d H:i:s"),
];
});

Завод для \ App \ Subscriber

$factory->define(App\Subscriber::class, function (Faker\Generator $faker) {
return [
    'name' => $faker->name,
    'email' => $faker->freeEmail,
    'phone' => $faker->phoneNumber,
    'fax' => $faker->phoneNumber,
    'address' => $faker->address,
];
});

FundSeeder.php

public function run()
{
    factory(App\Fund::class, 15)->create()->each(function ($u) {
        $u->subscriptions()->save(factory(App\Subscription::class)->make());
        $u->subscribers()->save(factory(App\Subscriber::class)->make());
    });
}

Однако когда я запускаю php artisan db:seed, возвращается следующая ошибка:

https://i.imgur.com/FFt6gFt.png

Однако это правильно, поскольку я не хочу, чтобы значение fund_id в таблице подписчиков. У фонда много подписок, а у подписчика много подписок.

Настоящая проблема в том, что я не могу понять, как создать все три модели одновременно, не вызывая ошибок.

Для меня было бы разумно сделать следующее:

public function run()
{
    factory(App\Fund::class, 2)->create()->each(function ($u) {
        $u->subscriptions()->save(factory(App\Subscription::class)->make({
            $u->subscribers()->save(factory(App\Subscriber::class)->make());
        }));

    });
}

Однако это приводит к Syntax Error - Unexpected {.

Как вы порекомендуете мне поступить так?


person chillyner    schedule 04.07.2017    source источник


Ответы (1)


Не очень понятно, как настраиваются ваши отношения, но, насколько я понимаю, подписчика нужно добавить в подписку, так что это может сделать это:

public function run()
{
    factory(App\Fund::class, 15)->create()->each(function ($u) {
        $u->subscriptions()->save(factory(App\Subscription::class)->make());
        $subscription = App\Subscription::latest()->get()->last();
        $subscription->subscribers()->save(factory(App\Subscriber::class)->make());
    });
}
person thefallen    schedule 04.07.2017
comment
Я добавил свои модели в исходный вопрос - пожалуйста, обратитесь к верхней части сообщения для дальнейших разъяснений. Хотя мне кажется, что вы на что-то наткнулись, попытка использовать ваш метод приводит к следующей ошибке [BadMethodCallException]. Вызов неопределенного метода Illuminate \ Database \ Query \ Builder :: save () - person chillyner; 04.07.2017