Как я должен использовать фабрики в Laravel, когда у меня есть значения по умолчанию в DB

#php #laravel

#php #laravel

Вопрос:

У меня есть фабрика:

 $factory->define(AppMissingData::class, function (Faker $faker) {
    $operations = Operation::all()->pluck('id')->toArray();
    $operationId = $faker->randomElement($operations);
    $operation = Operation::find($operationId);
    $meters = $operation->meters->pluck('id')->toArray();
    $arrStatus = ['Done', 'Undone'];
    return [
        'operation_id' => $operationId,
        'meter_id' => $faker->randomElement($meters),
        'date_ini' => $faker->dateTimeThisYear,
        'date_end' => $faker->dateTimeThisYear,
        'status' => $faker->randomElement($arrStatus),
    ];
});
  

В моей миграции у меня есть:

 $table->string('status')->default('Undone');
  

Когда я хочу вставить массив в DB, я всегда предпочитаю использовать factory:

 factory(MissingData::class)->create($missingData);
  

с

 return [
                'operation_id' => $measure->operation_id,
                'meter_id' => $measure->meter_id,
                'conso_prod' => $measure->conso_prod,
                'date_ini' => $missingDataIni,
                'date_end' => $missingDataEnd,
            ];
  

Желаемое поведение заключается в том, чтобы вставить статус: ‘Отменено’, настроенный в DB, но моя фабрика будет генерировать поддельный статус, поэтому мне всегда придется отправлять Undone статус на мою фабрику, что не является целью использования DB по умолчанию.

Как я должен управлять этим. Использование фабрики для создания и вставки модели является хорошей практикой.

Использование default в DB также очень практично, я считаю, что их можно использовать одновременно, но я не вижу, как мне это сделать.

Есть идеи?

Комментарии:

1. Ваша фабрика определяет значение для status , вы можете либо переопределить своим собственным значением, либо установить его равным null

2. Поэтому мне придется указывать значение этого поля при каждой вставке, я не смогу его опустить, не так ли? Разве это не идея при определении default? не нужно их указывать?

3. Вы также можете удалить его с вашего завода.

4. да, но если я сделаю это, я никогда не смогу заполнить фиктивные данные для этих 2 полей.

Ответ №1:

Вероятно, лучше всего установить статус по умолчанию, чтобы undone затем иметь отдельное состояние для done и любого другого статуса, который вы можете добавить.

 $factory->define(AppMissingData::class, function (Faker $faker) {
   $operations = Operation::all()->pluck('id')->toArray();
   $operationId = $faker->randomElement($operations);
   $operation = Operation::find($operationId);
   $meters = $operation->meters->pluck('id')->toArray();

   return [
       'operation_id' => $operationId,
       'meter_id' => $faker->randomElement($meters),
       'date_ini' => $faker->dateTimeThisYear,
       'date_end' => $faker->dateTimeThisYear,
       'status' => 'Undone',
   ];
  

});

 $factory->state(AppMissingData::class, 'done', fn() => ['status' => 'Done']);
  

Затем, когда вы хотите, чтобы статус был выполнен, вы бы использовали состояние, подобное этому.

 factory(AppMissingData)->state('done')->create();
  

Комментарии:

1. Также в качестве примечания вы можете захотеть кэшировать результаты запросов, которые вы выполняете на этой фабрике, чтобы это не замедляло вас при использовании его в тестах. Также было бы неплохо просто создать связанные модели прямо на фабрике, а затем переопределить их, когда вам нужно.