复合唯一密钥验证 - laravel

sum*_*mit 13 php validation laravel

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

 $rules = [

            'user_id' => 'required|unique:service_details,user_id',
            'service_id'=>'required|unique:service_details,service_id'
         ];
Run Code Online (Sandbox Code Playgroud)

以上将防止重复user_idservice_id 独立,这不是我的要求

它会拒绝

(1,2)
(1,3)
Run Code Online (Sandbox Code Playgroud)

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

har*_*ryg 24

复合独特的字段验证在5.0+中提供开箱即用的功能.我不能代表早期版本.

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

'term'  => 'unique:terms,term,NULL,id,taxonomy,category'
Run Code Online (Sandbox Code Playgroud)

这条规则说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;
];
Run Code Online (Sandbox Code Playgroud)


Erc*_*anE 8

我的解决方案

Laravel 5.3 和 5.4

注意:无模型绑定

店铺

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

更新

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


noz*_*man 6

Laravel开箱即用,这是不可能的.您可能必须编写自定义验证程序或使用程序包.

这是一个应该做你需要的: - https://github.com/felixkiss/uniquewith-validator

使用此包,您的规则可能如下所示:

$rules = array(
    'user_id' => 'required|unique_with:service_details,service_id',
    'service_id' => 'required',
);
Run Code Online (Sandbox Code Playgroud)

它适用于Laravel 4和5.