复合唯一密钥验证 - laravel

Posted

技术标签:

【中文标题】复合唯一密钥验证 - laravel【英文标题】:composite-unique-key-validation - laravel 【发布时间】:2015-05-19 12:36:59 【问题描述】:

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

 $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】:

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

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

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

【讨论】:

谢谢@harryg,你提供的链接真的很有帮助。通过它,我也能够解决我的问题。 :)【参考方案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】:

这在 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。

【讨论】:

是的,今天也会提出这个解决方案。在撰写本文时,此选项不可用(laravel 4 天)【参考方案4】:

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

【讨论】:

好答案。很好,很准确,谢谢。

以上是关于复合唯一密钥验证 - laravel的主要内容,如果未能解决你的问题,请参考以下文章

用于 Firebase 实时数据库/Firebase 身份验证的 Android 唯一密钥

自定义 MongoDB 对象 _id 与复合索引

为每个产品密钥生成序列号并验证它们[关闭]

不成功的Linq查询检索复合密钥表的数据

使用 Django 的复合/复合主/唯一键

mysql 复合 唯一 索引