laravel - 创建一个不返回任何东西的工厂 - Laravel
问题描述
介绍
大家好,
最近我选择了 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 表中之前删除插入的行,即使不是很好,它看起来也是唯一的解决方案。
我可以在不退货的情况下制造工厂吗?
谢谢并祝大家有美好的一天。
-里卡多
解决方案
好吧,我先欢迎你,然后问谁说建立一个返回任何东西的工厂不是一个好主意,正如 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),
];
});
正如这里提到的
然后您可以在此处提到的模型工厂中使用它
我想这是文档所说的最佳实践。
这也是一个快速介绍,您应该检查使用关系播种数据
推荐阅读
- android - 如何在android中将现有数据设置为Multiselection Spinner
- python - 我如何为我的图像分类器解释这个 - 低准确率但高精度和召回率?
- javascript - getStaticPaths 和 getStaticProps 在下一次构建期间失败
- php - 同时接受来自两个不同浏览器的授权金额付款
- c++ - c++ udp 广播。我需要一个套接字来读取和另一个来发送吗?
- java - 如何修复此 Java/ElasticSearch 错误?
- javascript - chart.js - 当图表 js Linechart 中只有一个标签时如何绘制和管理线条
- python - Django-parler 不返回查询集中的翻译字段
- docker - 无法 ssh 到 docker 容器中的 GitLab ee
- python-3.x - Python svgpathtools 缩放方法奇怪的结果