代码之家  ›  专栏  ›  技术社区  ›  Red Eyez

如何验证Laravel中两个字段的唯一组合?

  •  0
  • Red Eyez  · 技术社区  · 6 年前

    我添加了行$table->唯一(数组('ssn','lastfour');在用户迁移中,我还在注册中添加了一些字段,这些字段工作正常,数据库也正常。大约9个月前,我在一个类似的问题中尝试了这个解决方案 Laravel unique validation on multiple columns 但我在“Rule::unique('servers')->where(function($query)use($ssn,$lastfour)”行中得到了未定义的变量

    protected function validator(array $data)
    {
        return Validator::make($data, [
            'name' => ['required', 'string', 'max:255'],
            'lastname' => ['required', 'string', 'max:255'],
            'username' => ['required', 'string', 'max:255', 'unique:users'],
            'ssn' => ['required', 'string', 'regex:/^[0-9]*$/','max:8', 'min:8'],
            'lastfour' => ['required', 'string', 'regex:/^[0-9]*$/','max:4', 'min:4'],
            'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
            'password' => ['required', 'string', 'min:6', 'confirmed'],
        ]);
    }
    

    我尝试了以下代码

    'lastfour' => ['required', 'string', 'regex:/^[0-9]*$/','max:4', 'min:4', 
                            Rule::unique('users')->where(function ($query) use 
                            ($ssn, $lastfour){
                                return $query->where('ssn', $ssn)
                                ->where('lastfour', $lastfour);
                            })
            ],
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   apokryfos    6 年前

    $ssn $lastfour 似乎在任何地方都没有定义。您可以尝试以下方法:

    protected function validator(array $data)
    {
        $uniqueRule =  Rule::unique('users')->where(function ($query) use 
                        ($data){
                            return $query->where('ssn', $data['ssn']??'')
                            ->where('lastfour', $data['lastfour']??'');
                        });
    
        return Validator::make($data, [
            'name' => ['required', 'string', 'max:255'],
            'lastname' => ['required', 'string', 'max:255'],
            'username' => ['required', 'string', 'max:255', 'unique:users'],
            'ssn' => ['required', 'string', 'regex:/^[0-9]*$/','max:8', 'min:8',  $uniqueRule ],
            'lastfour' => ['required', 'string', 'regex:/^[0-9]*$/','max:4', 'min:4'],
            'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
            'password' => ['required', 'string', 'min:6', 'confirmed'],
        ]);
    }
    
        2
  •  0
  •   Cui Mingda    5 年前

    您还可以使用两个查询

    $uniqueRule =  Rule::unique('users')->where(function ($query) use ($data){
        $query->where('ssn', $data['ssn']);
        $query->where('lastfour', $data['lastfour']);
    });