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

时间:2019-03-17 18:16:22

标签: laravel laravel-5.8

简介

大家好,

最近,我选择了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表中的数据之前,请删除插入的行,即使不是很好,它似乎也是唯一的解决方案。

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

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

-里卡多

1 个答案:

答案 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

查看是否有种子数据。
相关问题