如何为4个组合唯一列创建自定义验证规则

时间:2018-04-30 06:51:55

标签: php laravel

由于Laravel的默认unique:tablename验证规则只允许两列;在两个以上列唯一的情况下,它会直接抛出QueryException SQLSTATE errorcode 23000。作为临时解决方法,我正在捕获异常并发出如下警告:

try{
    //My query that might throw an exception for a duplicate entry
} catch (\Exception $e){
    return $e->getCode() == 23000 ?
           redirect()->back()->with('warning','Duplicate entry') :
           redirect()->back()->with('error','Unknown Error Occurred');
}

问题是,对于错误代码不是23000的其他每个场景,我只会看到错误消息Unknown Error Occurred而不是Whoops。显然,调试将是一场噩梦。

所以我找了替代品。我必须选择以下两个选项之一:a)使用third party package或b)创建custom validation rule

我选择了选项b。但我正在努力学习如何自己构建一个。当我查看一个示例(对于一次性内联规则)时:

$validator = Validator::make($request->all(), [
    'title' => [
       'required',
       'max:255',
        function($attribute, $value, $fail) {
            if ($value === 'foo') {
                return $fail($attribute.' is invalid.');
            }
        },
    ],
]);

...我意识到该规则只能应用于单个属性和值。但我有4个属性和值来检查它们是否确实是一个唯一的条目。我怎么能这样做?

1 个答案:

答案 0 :(得分:1)

我这样用,

public function store(Request $req)
{
    $column1 = $req->input('column1');
    $column2 = $req->input('column2');
    $column3 = $req->input('column3');
    $column4 = $req->input('column4');


    $whereData = [
        ['column1', $column1],
        ['column2', $column2],
        ['column3', $column3],
        ['column4', $column4]
    ];

    $count = DB::table('yourtablename')->where($whereData)
                                ->count();

    if($count > 0){
        // The combined is not unique
        //send error message
    }else{
        //do whatever u need
    }

}

您也可以在AppServiceProvider的启动方法中实现此功能。

将此代码添加到您的启动方法中:

Validator::extend('uniqueofFourColumns', function ($attribute, $value, $parameters, $validator) {

    $whereData = [
        ['column1', $value],
        ['column2', $parameters[0]],
        ['column3', $parameters[1]],
        ['column4', $parameters[2]]
    ];

    $count = DB::table('yourtablename')->where($whereData)->count();

    return $count === 0;
});

然后你可以在任何需要的地方使用uniqueofFourColumns这个规则:

'column1' => 'uniqueofFourColumns:'.{{$request->column2}}.', '.{{$request->column3}}.', '.{{$request->column4}}