Составной уникальный ключ-валидация - laravel
кажется невозможным со встроенными валидаторами, как я должен реализовать эту функцию в модели?
$rules = [
'user_id' => 'required|unique:service_details,user_id',
'service_id'=>'required|unique:service_details,service_id'
];
выше предотвратит дублирование user_id
и service_id
независимо, что не является моим требованием
он отклонит
(1,2)
(1,3)
потому что 1 является дубликатом, но он должен быть принят, поскольку я хочу составной уникальный ключ
Ответы
Ответ 1
Сложная уникальная проверка поля предоставляется в версии 5.0+. Я не могу говорить за более ранние версии.
Вы можете по существу указать предложение where, когда применяется ваше уникальное правило валидации. Например.
'term' => 'unique:terms,term,NULL,id,taxonomy,category'
В этом правиле указано, что term
должно быть уникальным в таблице terms
, но только там, где taxonomy
равно "категории".
Например, это предотвратит дублирование категории "новости", но я все еще могу иметь тег "новости".
Я не знаю вашу схему, но в вашем случае это будет примерно так:
$user_id = Request::get('user_id', $default);
$service_id = Request::get('service_id', $default);
// or another way of specifying the accompanying service/user ID for the where clauses
$rules = [
'user_id' => 'unique:service_details,user_id,NULL,id,service_id,' . $service_id;
'service_id' => 'unique:service_details,service_id,NULL,id,user_id,' . $user_id;
];
Ответ 2
Это невозможно из коробки в Laravel. Вам нужно либо написать настраиваемый валидатор, либо использовать для этого пакет.
Вот тот, который должен делать то, что вам нужно:
- https://github.com/felixkiss/uniquewith-validator
С помощью этого пакета ваши правила могут выглядеть так:
$rules = array(
'user_id' => 'required|unique_with:service_details,service_id',
'service_id' => 'required',
);
Он работает как для Laravel 4, так и для 5.
Ответ 3
Мое решение
Laravel 5.3 и 5.4
Примечание: без привязки к модели
Магазин
'required',
Rule::unique('service_details','service_id')->where(function ($query) {
$query->where('user_id', $this->request->get('user_id'));
})
Обновление
'required',
Rule::unique('service_details','service_id')->ignore($this->route()->id)->where(function ($query) {
$query->where('user_id', $this->request->get('user_id'));
})
Ответ 4
С помощью этой ссылки, я могу получить составную валидацию из коробки laravel 5.3. Я знал, что это старый вопрос и уже ответил. В моем случае комбинация поставщиков и клиентов уникальна.
Мой пример кода ниже
$this->validate($request, [
'Vendor'=> 'bail|required|int',
'Client'=> 'bail|required|int',
'discount'=> 'required|numeric',
'Client'=>'unique:billings,client_id,vendor_id'.$request->Vendor
]);