大家好,
最近,我选择了Laravel,但我仍在学习该框架(通过这种方式,我感到很惊奇)。
我正在一个项目中,我有一个名为Order的模型,该模型用于通过使用一对一变形关系将其他Order模型(例如ClassicOrder,InstantOrder等)分组。
Orders表存储一个ID,一个order_id和用于变体关系的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表中的数据之前,请删除插入的行,即使不是很好,它似乎也是唯一的解决方案。
我可以在不退货的情况下工厂吗?
感谢并祝大家有美好的一天。
-里卡多
答案 0 :(得分:1)
很好的lemme首先欢迎您,然后问谁说让工厂返回任何东西不是一个好主意,正如Laravel文档中提到的那样:-
use Illuminate\Support\Str;
use Faker\Generator as Faker;
$factory->define(App\User::class, function (Faker $faker) {
return [
'name' => $faker->name,
'email' => $faker->unique()->safeEmail,
'email_verified_at' => now(),
'password' => '$2y$10$TKh8H1.PfQx37YgCzwiKb.KjNyWgaHb9cbcoQgdIVFlYg7B77UdFm', // secret
'remember_token' => Str::random(10),
];
});
如上所述Here
然后您可以按照Here
的说明在模型工厂中使用它我想这是文档所述的最佳实践。
这也是一个快速的介绍,您应该使用Relationships
查看是否有种子数据。