复合-唯一-密钥-验证 - laravel

2022-08-30 18:52:25

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

 $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是重复的,但它应该被接受,因为我想要复合唯一键


答案 1

复合唯一字段验证在 5.0+ 中开箱即用。我不能说早期版本。

您基本上可以指定一个 where 子句,用于应用唯一验证规则的时间。例如:

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

此规则规定,该规则在表中应是唯一的,但仅在 等于“类别”的情况下。termtermstaxonomy

例如,它将防止“新闻”类别被复制,但我仍然可以有一个“新闻”标签。


我不知道你的模式,但在你的情况下,它会像这样:

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

推荐