Как написать правило для проверки того, что комбинация нескольких столбцов должна быть уникальной в Laravel 6, PHP?

Допустим, у вас есть users таблица со столбцом email, а адрес электронной почты должен быть уникальным для каждого пользователя, вы можете использовать следующее правило проверки в Laravel.

[
    'email' => 'unique:users,email,' . $user->id,
]

В моем случае моя users таблица выглядит следующим образом

id
email
type

В моем случае комбинация email и type должна быть уникальной, что означает, что email может существовать более одного раза, как и type. Но комбинация email и type должна быть уникальной. Желаемый результат выглядит следующим образом

id       email                type
 1       [email protected]           1    // OK! unique
 2       [email protected]           2    // OK! unique
 3       [email protected]           1    // OK! unique
 4       [email protected]           2    // OK! unique
 5       [email protected]           1    // NOT OK! already exists with id = 1.
 6       [email protected]           2    // NOT OK! already exists with id = 4.

Как написать правило для проверки того, что комбинация email и type должна быть уникальной в Laravel, PHP, чтобы предотвратить вставку записи с идентификаторами 5 и 6 в базу данных?


person O Connor    schedule 01.10.2019    source источник
comment
Возможный дубликат уникальной проверки Laravel для нескольких столбцов   -  person Salim Djerbouh    schedule 01.10.2019
comment
Я бы обработал это на уровне базы данных лично и поймал бы уникальные ключевые ошибки.   -  person ceejayoz    schedule 01.10.2019


Ответы (2)


Уникальное правило проверки Laravel не рассматривает комбинации полей скважин как уникальные. Поэтому лучший вариант для вас - реализовать собственный метод проверки или класс с настраиваемым запросом. Вероятно, проще всего реализовать вариант закрытия (но вам понадобится модифицированный пользовательский экземпляр):

function ($attribute, $value, $fail) use ($user) {
  $exists = User::where('users.email', $value)
    ->where('users.type', $user->type)
    ->where('users.id', '!=', $user->id)
    ->count();

  if ($exists) {
    $fail($attribute . ' is invalid.');
  }
}

Если вы получили оба поля в запросе (как тип, так и адрес электронной почты), вы можете посмотреть решение, на которое ссылается Caddy DZ, в комментариях, но я думаю, что это не ваш случай.

person Lucas Ferreira    schedule 01.10.2019

Нашли какое-то компактное решение. У меня это работает как для создания, так и для обновления.

[
    'column_1' => 'required|unique:TableName,column_1,' . $this->id . ',id,colum_2,' . $this->column_2
]

Примечание: протестировано в Laravel 6.

Я поставил этот ответ в другой вопрос (уникальная проверка Laravel для нескольких столбцов) кого-то другого.

person O Connor    schedule 01.10.2019