Похоже, у вас есть две проблемы, которые вам нужно решить, чтобы сократить код:
- 1) Поля названия продукта и sku обязательны, но вы хотите избежать конфликтов со значениями, которые существуют напродукт, который вы планируете обновить.
- 2) Поле описания фактически не требуется, но когда оно присутствует, оно не должно проверяться.(не должно ли быть
min:1
проверка или что-то в этом роде?)
Так что, чтобы решить # 1, вам нужно написать собственное правило unique
, чтобы игнорировать текущую $product
, которую вы пытаетесьобновить при определении уникального значения.См. Формирование уникального правила игнорирования данного идентификатора - Документы Laravel
И для решения # 2 вы можете использовать sometimes
проверка Условно добавленные правила - Документы Laravel
Комбинируя их, вы должны использовать одно утверждение проверки, например:
use Illuminate\Validation\Rule;
...
$this->validate($request, [
'name' => [
'required',
Rule::unique('products')->ignore($product->id)
],
'sku' => [
'required',
Rule::unique('products')->ignore($product->id)
],
'description' => Rule::sometimes('description', 'required', function($input){
return $input->description !== $product->description;
});
]);
Если это не так, пожалуйста, обновите этот ответ для следующего человека, который оступится.Надеюсь, что это поможет.
[Подсказка:] Это кажется длинным выстрелом, но если поле описания представляет собой поле WYSIWYG на интерфейсе клиента, я бы сделал так, чтобы они достигли максимальной длины текстового поля, поскольку они могут преобразовывать изображенияв base64, так что, хотя это маловероятно для большинства ситуаций, я пытаюсь включить max:65535
в проверку, чтобы она не удалась.(65535 - максимальная длина текстового поля MySQL, другие базы данных имеют разные размеры)