2014-03-27 83 views
2

我有我的模型驗證規則:Laravel模式:只更新一個字段

protected $fillable = array('username','firstname','lastname',"street","city","country","birthday","email"); 

public static $rules = array(
    'username' => 'required|between:4,16|unique:users', 
    'email' => 'required|email|unique:users', 
    'password' => 'required|min:4', 
    'firstname' => 'required|alpha_num|between:2,16', 
    'lastname' => 'required|alpha_num|between:2,32', 
); 

和我的更新方法:

public function update($id) 
{ 
    $user = User::find($id);   
    $data = Input::all();  
    if (isset($data['firstname'])) { 
     $user->firstname = $data['firstname']; 
    } 

    $success = $user->update(); 

    if ($success) { 
     return Response::json(array('error' => false, 'user' => $user->toArray()), 200); 
    } else { 
     return Response::json(array('error' => true, 'message' => $user->errors()->all()), 400); 
    } 
} 

現在我得到一個錯誤:

{ 
    "error": true, 
    "message": [ 
     "The username has already been taken.", 
     "The email has already been taken." 
    ] 
} 

所以,問題是:我如何只更新模型的一個領域?

UPDATE:

由於我使用的是阿特(https://github.com/laravelbook/ardent)我可以這樣做:

$success = $user->updateUniques(); 

和現在的一切工作。

回答

1

錯誤消息說,更新模型時,驗證唯一需求檢測到用戶名和電子郵件已存在。爲了避免這種情況,請將當前更新的id實例附加到make validator中。在驗證使用參數來檢測是否要更新或創建它,併發送在第一種情況下,用戶ID,那麼你可以使用:

迫使獨特的規則將其忽略給定的ID

'username' => 'required|between:4,16|unique:users,'.$userId, 
'email' => 'required|email|unique:users,'.$userId, 

更多的細節在這裏:https://stackoverflow.com/a/22406205/1165509

+0

我該如何附加當前更新的id實例? – Hese

+0

一個可能的實現:http://stackoverflow.com/a/22406486/1165509 – marcanuy

0
protected function setConditionalRules($model) 
{ 
    $id = $model->getKey(); 
    foreach(['email', 'username'] as $field) 
    { 
     $this->validator->sometimes($field, $this->rules[$field].",$id", function($input) use($model, $field) 
     { 
      if($model->exists) 
      { 
       $this->validator->setRules(array_except($this->validator->getRules(), [$field])); 
       return true; 
      } 
      return false; 
     }); 
    } 

}