复合唯一密钥验证 - laravel

时间:2015-03-17 06:59:03

标签: php validation laravel

使用内置验证器似乎不可能,我应该如何在模型中实现此功能?

 $rules = [

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

会单独防止user_idservice_id的重复,这不是我的要求

它将拒绝

(1,2)
(1,3)

因为1是重复的但应该被接受,因为我想要复合唯一键

4 个答案:

答案 0 :(得分:23)

复合唯一字段验证is provided out-of-the-box in 5.0+。我不能代表早期版本。

实际上,您可以为适用的唯一验证规则指定where子句。 E.g。

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

此规则表明termterms应该是唯一的,但仅限于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;
];

答案 1 :(得分:6)

Laravel开箱即用,这是不可能的。您可能需要编写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。

答案 2 :(得分:2)

我的解决方案

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'));
})

答案 3 :(得分:1)

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
    ]);