介绍
大家好,
最近我选择了 Laravel,我还在学习这个框架(顺便说一句,我觉得这很神奇)。
我正在做一个项目,其中我有一个名为 Order 的模型,我使用该模型通过一对一的变形关系对其他 Order 模型(例如 ClassicOrder、InstantOrder 等)进行分组。
Orders 表存储一个 id、一个 order_id 和用于 morph 关系的 order_type。
问题
我已经为每种订单类型创建了一个工厂,现在我想创建一个通过在所有订单类型之间随机挑选来生成 n 个订单的工厂。
我已经这样做了:
$factory->define(Order::class, function (Faker $faker) {
$className = collect(Order::getModels())->random();
$order = factory($className)->create();
return [
'order_id' => $order->id,
'type' => get_class($order)
];
});
现在,这是可行的,但问题是每个订单都使用一个名为 Order 的特征,该特征已经在订单表中注册了订单,因此当我调用工厂时,我将在订单表中获得同一订单的两行。
这是顺序特征:
Trait Order {
public static function boot()
{
parent::boot();
self::created(function ($model) {
// Add the order to the orders table to give him a public id
DB::table('orders')->insert(['order_id' => $model->id, 'type' => self::class]);
// Set and create the order path if the order isn't instant
if (!is_a($model, 'App\InstantOrder')) {
$orderType = explode('\\', get_class($model))[1]; // App\OrderType -> OrderType
$folderName = $orderType . '_' . $model->publicId . '_' . time() . '/';
$model->path = public_path() . '/storage/orders/' . $folderName;
$model->save();
File::makeDirectory($model->path, 0777, true);
}
});
self::creating(function ($model) {
$model->{$model->getKeyName()} = Uuid::generate()->string;
});
}
}
我可以通过调用 factory()->make() 而不是 factory->create() 来避免这种情况,但这对我来说似乎不对。
问题
我已经考虑了一些解决方案,并得出以下结论:
- 不要让工厂退回任何东西,但看起来我不能。
- 在返回数据以存储在 Orders 表中之前删除插入的行,即使不是很好,它看起来也是唯一的解决方案。
我可以在不退货的情况下制造工厂吗?
谢谢并祝大家有美好的一天。
-里卡多