似乎内置验证器是不可能的,我应该如何在模型中实现此功能?
$rules = [
'user_id' => 'required|unique:service_details,user_id',
'service_id'=>'required|unique:service_details,service_id'
];
以上将防止user_id
和独立service_id
的重复,这不是我的要求
它将拒绝
(1,2)
(1,3)
因为 1 是重复的,但它应该被接受,因为我想要复合唯一键
复合唯一字段验证在 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.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'));
})
这在拉拉维尔中是不可能开箱即用的。您要么必须编写自定义验证器,要么为此使用包。
这是一个应该做你需要的:- https://github.com/felixkiss/uniquewith-validator
使用此包,您的规则可能如下所示:
$rules = array(
'user_id' => 'required|unique_with:service_details,service_id',
'service_id' => 'required',
);
它适用于Laravel 4和5。
借助此链接,我能够从开箱即用的 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
]);