кажется, что это невозможно со встроенными валидаторами, как я должен реализовать эту функцию в модели?
$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 дублируется, но он должен быть принят, поскольку я хочу составной уникальный ключ
Сводная уникальная проверка поля предоставляется в версии 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; ];
Это невозможно из коробки в Ларавеле. Вам нужно будет либо написать специальный валидатор, либо использовать для этого пакет.
Вот тот, который должен делать то, что вам нужно: https://github.com/felixkiss/uniquewith-validator
С помощью этого пакета ваши правила могут выглядеть так:
$rules = array( 'user_id' => 'required|unique_with:service_details,service_id', 'service_id' => 'required', );
Он работает как для Laravel 4, так и для 5.
Мое решение
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')); })
С помощью этой ссылки я могу получить композитную валидацию из коробки 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 ]);