Laravel验证在更新和保存方面的差异

时间:2014-11-06 10:12:51

标签: laravel laravel-4

我正在使用Jeffrey Way的模型验证(https://github.com/JeffreyWay/Laravel-Model-Validation)来验证保存和更新。使用此方法,假设您在条目上填写更新某些字段,然后调用save()方法,验证将在当前在条目上设置的所有字段上运行。但是,如果验证要求字段(比如电子邮件地址)是唯一的,则验证将失败,因为它已经存在:

user.php的:

protected static $rules = [
    'email' => 'required|email|unique:users',
    'firstname' => 'required',
    'lastname' => 'required'
];

Controller.php这样:

     // Get user from id
    $user = User::find($id);

    // Update user
    $user->update($data);

    // Validation when model is saved, via Way\Database\Model
    if ($user->save())
    {
            return Response::json([
                'data' => $user->toArray()
            ], 200);
    }

    if ($user->hasErrors())
    {
        return Response::json([
            'errors' => $user->getErrors()
        ]);
    }

将返回错误,因为电子邮件地址验证失败。那么,使用这种方法,您如何告诉验证者忽略电子邮件的唯一规则?

3 个答案:

答案 0 :(得分:0)

我遇到了这个问题!我自己决定了这个问题。

protected static $rules = [
    'email' => $user->email == Input::get('email') ? 'required|email' : 'required|email|unique:users',
    'firstname' => 'required',
    'lastname' => 'required'
];

答案 1 :(得分:0)

使用此程序包无法执行此操作,因为您需要为unique规则传递id。你可以这样做:

protected static $rules = [
    'email' => 'required|email|unique:users,email,{id}',
    'firstname' => 'required',
    'lastname' => 'required'
];

并扩展此模型以添加自定义验证方法,以{id}属性替换id

答案 2 :(得分:0)

我认为我使用不同方法的类似行为。使用这个模型,我推翻覆盖验证方法以从自定义方法获取规则,你可以为现有模型设置新规则。

这样的事情可行:

protected function processRules($rules = array()) {
     $result = [];
     if (empty($rules)) {
         $rules = static::$rules; 
     }
     // Add unique except :id
     $replace = ($this->exists()) ? ',' . $this->getKey() : '';
     foreach ($rules as $key => $rule) {
         $result[$key] = str_replace(',:' . $this->getKeyName(), $replace, $rule);
     }

     return $result;       

}

覆盖您的validate方法以调用proccessRules方法。

 public function validate() {
     $v = $this->validator->make($this->attributes, $this->processRules(static::$rules), static::$messages);
     if ($v->passes()) {
         return true;
     }
     $this->setErrors($v->messages());
     return false;
 }

现在,您可以将email规则定义为required|email|unique:users:id,当新用户的规则应为required|email|unique:users时,当您更新ID为1234的用户时,规则将是required|email|unique:users:1234

我希望它适合你。