Составной уникальный ключ-валидация - 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
    ]);