Создайте фабрику, которая ничего не возвращает - Laravel - PullRequest
3 голосов
/ 17 марта 2019

Intro

Привет всем,

Недавно я выбрал Laravel, и я все еще изучаю фреймворк (что, кстати, мне кажется удивительным).

Я работаю над проектом, в котором у меня есть модель с именем Order, которую я использую для группировки других моделей Order (например, ClassicOrder, InstantOrder и т. Д.) С использованием отношения морфа один к одному.

В таблице «Заказы» хранятся идентификатор, идентификатор_порядка и тип_заказа, которые используются для отношения морфинга.

Проблема

Я создал фабрику для каждого типа заказаи теперь я хочу создать фабрику, которая генерирует 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 (), но мне это не кажется правильным.

Вопрос

Я подумал о некоторых решениях и выдал следующее:
- Не заставляйте фабрику ничего возвращать, но похоже, что я могу 't.
- Удалите вставленные строки перед возвратом данных для хранения в таблице «Заказы», ​​и даже если это не очень здорово, это выглядит как единственное решение.

Могу ли я сделать фабрику, ничего не возвращая?

Спасибо и желаю всем хорошего дня.

-Риккардо

1 Ответ

1 голос
/ 18 марта 2019

Хорошо, давайте сначала поприветствуем вас, а затем спросите, кто сказал, что это не очень хорошая идея - создать фабрику, которая будет что-либо возвращать, как сказано в документации 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),
    ];
});

Как уже упоминалось Здесь

И затем вы можете использовать его на модельных фабриках, как упомянуто Здесь

Я полагаю, что это лучшая практика, так как Документация говорит, что я предполагаю.

И это также краткое введение, которое вы должны проверить на наличие данных заполнения с помощью Отношения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...