2014-11-06 94 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屬性