如何使用laravel中的where()创建唯一规则

时间:2018-04-10 07:51:56

标签: php laravel

嗨,伙计们,我是laravel的新人,对于我的问题,我搜索了许多帖子,但找不到任何解决方案,如果你有任何指导或解决方案,我会感激。

我制定了一个独特的规则,但它不起作用并返回空值,以便我如何以正确的方式做到这一点?

在我的情况下,我需要检查列'last_ingameChange'值必须低于time()否则验证需要返回错误消息“你只需要1周时间来更改你的游戏内用户名”

public function validator(array $data, array $rules)
{
    return Validator::make($data, $rules);
}

public function updateUserAccount(Request $request, $id)
{

    $rules = [
        'required|min:5|max:255|unique:users,ingame_name,'.$id.'|'.Rule::unique('users')->where('last_ingameChange',  '<', time())
    ];

    $rr = $this->validator([$request->input('ingame_name')], $rules);

    dd($rr);

}

但是initialRules是:

"ingame_name" => "required|min:5|max:255|unique:users,ingame_name,1|unique:users,NULL,NULL,id"

2 个答案:

答案 0 :(得分:0)

你正在做的事情根本不起作用,因为:

  1. 您需要提供验证字段
  2. Rule::unique将返回Rule实例而不是字符串,因此您无法将其连接到另一个字符串,或者您可能强制它强制转换为字符串,这显然会丢失您的任何信息在哪里。
  3. 您可以使用数组来包含规则:

    $rules = [        
      'ingame_name' => [ //Field name
          "required", 
           "min:5", 
           "max:255", 
           "unique:users,ingame_name,$id", 
           Rule::unique('users', 'ingame_name')
               ->using(function ($q) { $q->where('last_ingameChange',  '<', time()); })
       ]
    ];
    
    $this->validator($request->all(), $rules);
    

    正如@MikeFoxtech建议最好使用before规则

答案 1 :(得分:0)

试试这个

Rule::unique('users')->ignore($id, 'ingame_name')->where(function ($query) {
    return $query->where('last_ingameChange',  '<', time());
})