2014-11-06 64 views
1

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

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() 
     ]); 
    } 

由于电子邮件地址验证失败,将返回错误。所以,用这种方法,你如何告诉验证者忽略电子邮件的唯一规则?

回答

0

我觉得我用不同的方法类似的行为来取代{id}。使用这个模型,我推荐你重写validate方法以从自定义方法中获取规则,以便你可以为现有模型设置新规则。

像这样的东西可以工作:

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

我希望它适合您。

+0

这是完美的 - 工作正常。在你的代码中有一个“)”缺少,但是在'(empty($ rules)'后面。“感谢您的帮助! – babbaggeii 2014-11-06 10:42:41

+0

不客气,它几乎与我目前使用的模型类似 - 其他的补充 - 所以我已经解决了这个问题,也许你可能对Ardent感兴趣(https://github.com/laravelbook/ardent),我正在使用这个,我修正了括号;-) – fmgonzalez 2014-11-06 12:05:13

0

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

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

它不起作用。这些是静态属性。 – 2014-11-06 10:24:26

+0

是的,你是对的!我已经在我的项目中使用https://github.com/cartalyst/sentry – 2014-11-06 10:35:17

0

你不能使用这个包,因为你需要通过ID为unique规则。你可以这样来做:

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

和扩展这个模型来添加自定义的验证方法与id属性