gpt4 book ai didi

laravel - 创建一个不返回任何东西的工厂 - Laravel

转载 作者:行者123 更新时间:2023-12-02 02:45:43 25 4
gpt4 key购买 nike

介绍

大家好,

最近我选择了 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),
];
});

如前所述Here

然后您可以在提到的模型工厂中使用它 Here

我猜这是文档中所说的最佳实践。

这也是一个快速介绍,您应该使用 Relationships 查看播种数据。

关于laravel - 创建一个不返回任何东西的工厂 - Laravel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55210350/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com