Laravel 6 使用模型工厂播种一对多关系
Laravel 6 seeding one to many relationship using model factories
我有以下模型工厂:
$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")
为什么这些回调方法不起作用,有什么建议吗?
与其混合工厂和 eloquent,我认为只使用工厂会更干净,这样您就可以正确使用 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]);
});
我有以下模型工厂:
$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")
为什么这些回调方法不起作用,有什么建议吗?
与其混合工厂和 eloquent,我认为只使用工厂会更干净,这样您就可以正确使用 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]);
});