Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何为4个组合唯一的列创建自定义验证规则_Php_Laravel - Fatal编程技术网

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

Php 如何为4个组合唯一的列创建自定义验证规则,php,laravel,Php,Laravel,由于Laravel的默认验证规则只允许两列;在两个以上的列是唯一的情况下,它会直接抛出QueryException。作为临时解决方法,我捕获异常并抛出如下警告: try{ //My query that might throw an exception for a duplicate entry } catch (\Exception $e){ return $e->getCode() == 23000 ? redirect()->back()-

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

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的其他场景,我只会看到错误消息
发生未知错误
,而不是。显然,调试将是一场噩梦

所以我寻找替代品。我必须从两个选项中选择一个:a)使用a或b)创建a

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

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

我这样用

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}}
我用这个,

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}}

试试看。检查验证后钩子中所有4个字段的唯一性。好的,我正在尝试。但是
somethingElseIsInvalid()
方法是占位符方法还是真的有目的?在API文档中找不到它。您希望如何实现唯一规则?你能举个例子吗?类似于
multicolumnunique:tablename,column1,column2,column3,column4
那么你可以使用多个唯一规则。比如,
unique:table1,column1 | unique:table1,field2 | unique:table1,field3
。或者在after-validation钩子中,您必须在
somethingElseIsInvalid()的位置为4个字段实现unique的逻辑。检查验证后钩子中所有4个字段的唯一性。好的,我正在尝试。但是
somethingElseIsInvalid()
方法是占位符方法还是真的有目的?在API文档中找不到它。您希望如何实现唯一规则?你能举个例子吗?类似于
multicolumnunique:tablename,column1,column2,column3,column4
那么你可以使用多个唯一规则。比如,
unique:table1,column1 | unique:table1,field2 | unique:table1,field3
。或者在after validation hook中,您必须在
somethingElseIsInvalid()的位置为4个字段实现unique的逻辑,这不是真正的规则,这是我在验证规则中要做的。但我不知道怎么做。谢谢@arun。有没有办法使列也成为动态的?如果我没有为每个表使用相同的列名怎么办?为了使它更具动态性,我可以建议进行编辑吗?让我们将第一个参数作为$tablename发送:
'column1'=>uniqueofFourColumns:yourtablename.{{$request->column2}}.'.{$request->column3}.''.'.'.
然后在引导方法中:
$count=DB::table($tablename)->where($whereData)->count()这不是真正的规则,这是我在验证规则中要做的。但我不知道怎么做。谢谢@arun。有没有办法使列也成为动态的?如果我没有为每个表使用相同的列名怎么办?为了使它更具动态性,我可以建议进行编辑吗?让我们将第一个参数作为$tablename发送:
'column1'=>uniqueofFourColumns:yourtablename.{{$request->column2}}.'.{$request->column3}.''.'.'.
然后在引导方法中:
$count=DB::table($tablename)->where($whereData)->count()