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