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

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

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

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

id
email
type

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

id       email                type
 1       A@mail.com           1    // OK! unique
 2       A@mail.com           2    // OK! unique
 3       B@mail.com           1    // OK! unique
 4       B@mail.com           2    // OK! unique
 5       A@mail.com           1    // NOT OK! already exists with id = 1.
 6       B@mail.com           2    // NOT OK! already exists with id = 4.

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

Ответы [ 2 ]

0 голосов
/ 01 октября 2019

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

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

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

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

0 голосов
/ 01 октября 2019

Уникальное правило проверки 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 в комментариях, но я думаю, что это не ваш случай.

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