首页 > 解决方案 > 创建一个不返回任何东西的工厂 - 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 表中之前删除插入的行,即使不是很好,它看起来也是唯一的解决方案。

我可以在不退货的情况下制造工厂吗?

谢谢并祝大家有美好的一天。

-里卡多

标签: laravellaravel-5.8

解决方案


好吧,我先欢迎你,然后问谁说建立一个返回任何东西的工厂不是一个好主意,正如 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),
    ];
});

正如这里提到的

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

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

这也是一个快速介绍,您应该检查使用关系播种数据


推荐阅读