Я пытаюсь настроить фабрику моделей в 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 {
.
Как вы порекомендуете мне поступить так?