2015-03-17 27 views
11

có vẻ như không thể với trình xác thực tích hợp, cách tôi nên triển khai tính năng này trong mô hình?composite-unique-key-validation - laravel

$rules = [ 

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

trên sẽ ngăn chặn duplicacy của user_idservice_id một cách độc lập mà không phải là yêu cầu của tôi

nó sẽ từ chối

(1,2) 
(1,3) 

vì 1 là trùng lặp nhưng nó phải được chấp nhận như tôi muốn khóa duy nhất tổng hợp

+0

nếu bạn không muốn viết một xác nhận tùy chỉnh, sau đó chạy các truy vấn (sẽ thất bại), nắm bắt ngoại lệ, kiểm tra lỗi và nếu nó thực sự không thành công do ràng buộc khóa duy nhất, thì hãy thêm công cụ xóa r tin nhắn trong túi tin nhắn và chuyển hướng đến trang trước đó. – itachi

Trả lời

13

Xác thực trường duy nhất tổng hợp is provided out-of-the-box in 5.0+. Tôi không thể nói cho các phiên bản trước đó.

Về cơ bản, bạn có thể chỉ định mệnh đề where khi áp dụng quy tắc xác thực duy nhất của bạn. Ví dụ.

'term' => 'unique:terms,term,NULL,id,taxonomy,category' 

Quy luật này nói rằng term phải là duy nhất trên bàn terms nhưng chỉ nơi taxonomy bằng "thể loại".

Ví dụ: nó sẽ ngăn danh mục "tin tức" bị trùng lặp nhưng tôi vẫn có thể có thẻ "tin tức".


Tôi không biết giản đồ của bạn nhưng trong trường hợp của bạn nó muốn được một cái gì đó như thế này:

$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

Không thể thoát khỏi hộp trong Laravel. Bạn sẽ phải viết một custom validator hoặc sử dụng một gói cho điều đó.

Dưới đây là một trong đó nên làm những gì bạn cần: - https://github.com/felixkiss/uniquewith-validator

Với gói này, các quy tắc của bạn có thể trông giống như sau:

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

Nó hoạt động cho cả Laravel 4 và 5.

0

Với sự giúp đỡ của link này, tôi có thể để đạt được xác nhận hợp từ ra khỏi hộp laravel 5.3. Tôi biết đó là câu hỏi cũ và đã trả lời rồi. Trong trường hợp nhà cung cấp và kết hợp khách hàng của tôi là duy nhất.

mẫu mã của tôi là dưới

$this->validate($request, [ 
     'Vendor'=> 'bail|required|int', 
     'Client'=> 'bail|required|int',  
     'discount'=> 'required|numeric',    
     'Client'=>'unique:billings,client_id,vendor_id'.$request->Vendor 
    ]); 
1

Giải pháp của tôi

Laravel 5,3 và 5.4

Lưu ý: Nếu không có ràng buộc

cửa hàng mô hình

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

Cập nhật

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