Проверяйте уникальную электронную почту при обновлении, игнорируя собственную электронную почту. На Ларавеле 5 - PullRequest
0 голосов
/ 14 сентября 2018

У меня есть приложение Laravel 5.4, всякий раз, когда я пытаюсь обновить пользователя с неизменным адресом электронной почты, я получаю сообщение об ошибке «Электронная почта уже используется», что имеет смысл, поскольку отредактированный пользователь уже имеет электронную почту.Обычно я имею дело с этим просто используя что-то вроде этого:

'email' => 'required|max:128|unique:users,email,'.$u->email,

Однако, это не работает в этом конкретном приложении.Я все еще получаю ту же ошибку «уже используется».

Полный объект правил проверки выглядит так, как только php заменяет строку:

$rules = [
  "name" => "required|max:64",
  "email" => "required|max:128|unique:users,email,user@admin.com",
  "role" => "required"
]

Я не могу найти что-то не так с этим,Что может быть причиной неправильной проверки?
Я добавлю весь процесс проверки функции обновления, если это поможет.

$u = User::find($id);

$input = $request->all();
$rules = [
  'name' => 'required|max:64',
  'email' => 'required|max:128|unique:users,email,'.$u->email,
  'role' => 'required'
];
$messages = [
  'email.required' => 'El Email es obligatorio',
  'email.max' => 'El Email no debe exceder los 128 caracteres',
  'email.unique' => 'Ya existe un usuario con este Email',
  'name.required' => 'El nombre es obligatorio',
  'name.max' => 'El Email no debe exceder los 64 caracteres',
  'role.required' => 'El Rol es obligatorio',
];
$validator = Validator::make($input, $rules, $messages);
if ( $validator->fails() ) {
  return redirect('users/'.$id.'/edit')->withErrors($validator)->withInput();
} else {
    // update user
}

1 Ответ

0 голосов
/ 14 сентября 2018

Передача $u->email не совсем подходит для правила unique. Подпись

unique:{table},{column},{value_to_ignore},{column_to_ignore}

Итак, с вашим правилом, установленным как

unique:users,email,'.$u->email

Он пытается найти пользователя с id, равным $u->email, из-за того, что по умолчанию column_to_ignore имеет значение id (или любой другой первичный ключ вашей таблицы users)

Чтобы это исправить, просто измените правило unique, как показано ниже:

$u = User::find($id);
$rules = [
    "email" => "required|email|max:128|unique:users,email,".$u->id.",id", 
    ...
];

Примечание. Вы можете опустить ",id" из правила, если хотите. Как уже говорилось, по умолчанию это первичный ключ вашей таблицы users. Если вы изменили его с id, вам нужно будет указать его.

С правилом, настроенным, как указано выше, это будет означать, что при редактировании этого пользователя и определении уникальных записей игнорируйте значение в столбце email, где users.id = $u->id.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...