2015-03-17 2 views
11

кажется, что это невозможно со встроенными валидаторами, как я должен реализовать эту функцию в модели?composite-unique-key-validation - laravel

$rules = [ 

      'user_id' => 'required|unique:service_details,user_id', 
      'service_id'=>'required|unique:service_details,service_id' 
     ]; 

выше предотвратит duplicacy из user_id и service_id независимо, что это не мое требование

он отклонит

(1,2) 
(1,3) 

потому, что 1 является дубликатом, но оно должно быть принято, как я хочу композиционный уникальный ключ

+0

если вы не хотите, чтобы написать пользовательскую проверку, а затем выполнить запрос (который не удастся), поймать исключение, проверить ошибку, и если это действительно не удалось из-за уникального ограничения ключа, добавьте erro r в пакете сообщений и перенаправить на предыдущую страницу. – itachi

ответ

13

Композитная уникальная проверка поля is provided out-of-the-box in 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; 
]; 
5

Это не возможно из коробки в Ларавеле. Вам нужно будет либо написать custom validator, либо использовать для этого пакет.

Вот один, который должен делать то, что вам нужно: - https://github.com/felixkiss/uniquewith-validator

С помощью этого пакета, ваши правила могут выглядеть следующим образом:

$rules = array(
    'user_id' => 'required|unique_with:service_details,service_id', 
    'service_id' => 'required', 
); 

Он работает как Laravel 4 и 5.

0

С помощью этого link, я могу достичь композиционных проверок из вне ящик 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 
    ]); 
1

Мое решение

Laravel 5.3 и 5.4

Примечание: Без модели связывания

магазин

'required', 
Rule::unique('service_details','service_id')->where(function ($query) { 
     $query->where('user_id', $this->request->get('user_id')); 
}) 

Update

'required', 
Rule::unique('service_details','service_id')->ignore($this->route()->id)->where(function ($query) { 
     $query->where('user_id', $this->request->get('user_id')); 
}) 
Смежные вопросы