Вы можете игнорировать определенные идентификаторы во время уникальной проверки:
use Illuminate\Validation\Rule;
public function store()
{
Product::create($this->validateRequest(new Product()));
return redirect('/product');
}
public function update(Product $product)
{
$product->update($this->validateRequest($product));
return redirect('/product');
}
private function validateRequest(Product $product)
{
return request()->validate([
'sub_category_id' => ['required'],
'name' => ['required', 'min:4'],
'code' => ['required', 'alpha_dash', Rule::unique('products')->ignore($product)],
'description' => ['required', 'min:4'],
'color' => ['required', 'min:3'],
'price' => ['required', 'integer'],
]);
}
Здесь вы либо передаете существующую модель при обновлении, либо новый экземпляр модели при сохранении, поэтому вызов $product->id
либо возвращает null
при сохранении нового продукта, поэтому ни один продукт в базе данных не игнорируется, или идентификатор при обновлении, а затем игнорируется только этот продукт.
Из docs :
Принуждение уникального правила игнорировать данный идентификатор:
Иногда вы можете sh игнорировать данный идентификатор во время уникальной проверки. Например, рассмотрим экран «обновить профиль», который включает имя пользователя, адрес электронной почты и местоположение. Вероятно, вы захотите убедиться, что адрес электронной почты уникален. Однако, если пользователь изменяет только поле имени, а не поле электронной почты, вы не хотите, чтобы выдавалась ошибка проверки, потому что пользователь уже является владельцем адреса электронной почты.
Чтобы проинструктировать Валидатор игнорирует ID пользователя, мы будем использовать класс Rule
, чтобы плавно определить правило. В этом примере мы также укажем правила проверки в виде массива вместо использования | для ограничения правил:
use Illuminate\Validation\Rule;
Validator::make($data, [
'email' => [
'required',
Rule::unique('users')->ignore($user->id),
],
]);
Однако имейте в виду следующее:
Вы никогда не должны передавать какие-либо управляемые пользователем запросы в метод игнорирования. Вместо этого вы должны передавать только сгенерированный системой уникальный идентификатор, такой как автоматически увеличивающийся идентификатор или UUID из экземпляра модели Eloquent. В противном случае ваше приложение будет уязвимо для атаки SQL инъекцией.