составной уникальный ключ-валидация – 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 дублируется, но он должен быть принят, поскольку я хочу составной уникальный ключ

Сводная уникальная проверка поля предоставляется в версии 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 ]);