ユーザー管理システムを作成しようとしています。「ユーザーの編集」部分を実装したいと思うまでは、すべてうまくいっています。ルールでユーザーのIDを無視することにより、一意のユーザー名と電子メールフィールドに関する「問題」を回避することに成功しました。
問題は、ユーザーを存在しないユーザー名または電子メールに更新しようとすると、すべてが機能することです。しかし、既に存在するものに対して同じことをしようとすると、エラーが発生します。
SQLSTATE [23000]: 整合性制約違反: 1062 キー 'users_username_unique' のエントリ 'existing_username_here' が重複しています
ルールに「一意の」フィールドが既に実装されているため、何が問題なのかわかりません。この特定の例外をキャッチしてユーザーに表示する方法はありますか? この問題を解決する方法はありますか? 私は何時間も検索してきましたが、役立つものが見つからないようです。
編集:既存のものを更新する代わりに、新しい raw を挿入しようとしているようです...! なぜそれが起こるのかわかりません。何かご意見は?
AdminController.php
public function update($id)
{
if ( ! $this->validator->isValidForAdminEdit()) {
return Redirect::back()->withErrors($this->validator->errors())->withInput();
}
$user = $this->register->getUserById($id);
$data = [
'id' => $user->id,
'first_name' => Input::get('first_name'),
'email' => Input::get('email'),
'username' => Input::get('username'),
'password' => Input::get('password'),
'activated' => Input::get('activated'),
'assign_role' => Input::get('assign_role')
];
$updatedUser = $this->adminRegister->update($data);
return Redirect::to('admin/users')
->with(['flash_message' => "The user $updatedUser->username has been edited.",
'flash_type' => 'success']);
}
DbAdminRepository.php
public function update(array $data)
{
$user = Register::find($data['id']);
$user->first_name = $data['first_name'];
$user->username = $data['username'];
$user->email = $data['email'];
if (isset($data['password']) && ($data['password'] != "")) {
$user->password = Hash::make($data['password']);
}
$user->activated = (! isset($data['activated']) ? (int)0 : (int)1);
$role = $data['assign_role'];
$user->save(); // THE PROBLEM SEEMS TO BE HERE
$user->roles()->detach();
$user->roles()->attach($role);
return $user;
}
Validator.php
public function isValidForAdminEdit(array $rules = array())
{
// if there are no rules return true.
if(!isset(static::$rules)) return true;
$rules = self::processRules($rules ? $rules : static::$admin_edit_rules);
$validator = V::make($this->attributes, $rules);
if ($validator->fails()) {
$this->errors = $validator->messages();
return false;
}
return true;
}
protected function processRules(array $rules)
{
// get the model's ID.
// If the ID is null, it's a new Model, so let's strip out the id completely.
$id = $this->attributes['id'];
$replacement = $id == null ? "" : "," . $this->attributes['id'];
array_walk($rules, function(&$item) use ($replacement)
{
// Replace placeholders
$item = stripos($item, ',:id:') !== false ? str_ireplace(',:id:', $replacement, $item) : $item;
});
return $rules;
}
public function errors()
{
return $this->errors;
}
UserValidator.php
static $admin_edit_rules = [
'username' => 'Required|Min:3|Max:32|Unique:registers,username,:id:',
'email' => 'Required|Between:3,64|Email|Unique:registers,email,:id:',
'first_name' => 'Required|Min:3|Max:80|Alpha',
'password' =>'AlphaNum|Between:4,20|Confirmed',
'password_confirmation'=>'AlphaNum|Between:4,20',
];