Laravel 6 сеют отношения один ко многим, используя модельные фабрики - PullRequest
1 голос
/ 29 апреля 2020

У меня есть следующие фабрики моделей:

 $factory->define(App\User::class, function (Faker $faker) {
   return [
      'first_name' => $faker->firstName,
      'last_name'  => $faker->lastName,
      'email' => $faker->unique()->safeEmail,
      'password' => 'secret', 
      'remember_token' => Str::random(10),
  ];
});

$factory->define(App\Order::class, function (Faker $faker) {
     return [
       'tax_id'  => 3,
       'total' => 0.00,
       'order_type' => 'Invoice'
    ];
});

$factory->define(App\OrderItem::class, function (Faker $faker) {
    return [
       'product_id' => 19,
       'product_name'  => 'Free product',
       'quantity' => 1,
       'item_price' => 0.00,
    ];
});

$factory->afterCreating(App\User::class, function ($user, $faker) {
     $user->orders()->save(factory(App\Order::class)->make());
});

$factory->afterMaking(App\Order::class, function ($order, $faker) {
     $order->orderItems()->save(factory(App\OrderItem::class)->make());
});

Когда я звоню factory(App\User::class, 2)->create();, я получаю сообщение об ошибке:

 Doctrine\DBAL\Driver\PDOException::("SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'order_id' cannot be null")

Почему эти методы обратного вызова не работают, любые советы оценили?

1 Ответ

1 голос
/ 29 апреля 2020

Вместо того, чтобы смешивать фабричные и красноречивые, я думаю, что было бы чище использовать фабричные, чтобы вы могли правильно использовать крючки afterCreating / afterMaking:

$factory->afterCreating(App\User::class, function ($user, $faker) {
    factory(App\Order::class)->create(['user_id' => $user->id]);
});

$factory->afterCreating(App\Order::class, function ($order, $faker) {
    factory(App\OrderItem::class)->create(['order_id' => $order->id]);
});
...