У меня есть 3 столбца в моей таблице email_1, email_2, email_3. Как избежать дубликатов между строками при создании и обновлении?
Для метода обновления я могу проверить по таким столбцам:
public function rules()
{
/** OTHER VALIDATION RULES */
'email_1' => [
'required',
'email',
'unique:users,email_1,' . $this->id,
],
'email_2' => [
'required',
'email',
'unique:users,email_2,' . $this->id,
],
'email_3' => [
'required',
'email',
'unique:users,email_3,' . $this->id,
]
/** OTHER VALIDATION RULES */
}
Проблема заключается в том, чтобы не использовать один и тот же адрес электронной почты в трех полях ввода моей формы?
Вы можете использовать правило different
для email_2 и email_3, чтобы убедиться, что все 3 значения различны.
public function rules(){
/** OTHER VALIDATION RULES */
'email_1' => [
'required',
'email',
'unique:users,email,' . $this->id,
],
'email_2' => [
'required',
'email',
'unique:users,email_2,' . $this->id,
'different:email_1',
],
'email_3' => [
'required',
'email',
'unique:users,email_3,' . $this->id,
'different:email_2',
],
/** OTHER VALIDATION RULES */
}
Самый простой способ — использовать правило проверки different
. Что-то вроде этого:
'email_1' => [
'required',
'email',
'different:email_2'
'different:email_3',
'unique:users,email,' . $this->id,
],
'email_2' => [
'required',
'email',
'different:email_1'
'different:email_3',
'unique:users,email_2,' . $this->id,
],
'email_3' => [
'required',
'email',
'different:email_1'
'different:email_2',
'unique:users,email_3,' . $this->id,
],
Я вижу, вы проходите проверку в классе Request
, и это здорово, потому что вы можете использовать After Hooks.
public function withValidator($validator)
{
$emails = [Request['email_1'], Request['email_2'], Request['email_3']];
$validator->after(function ($validator) use ($emails) {
if (count($emails) == count(array_unique($emails))) {
// Add error to message bag.
$validator->errors()->add('key', 'message');
}
});
}
В приведенном выше примере используется array_unique()
, который удалит дубликаты. Сравнение длины оригинала и длины дедупликации покажет наличие дубликатов.
Рад, что смог помочь 😊
Я нашел первый способ и увидел ваш ответ, как в то же время. Метод 2 тоже кажется отличным, но это слишком много для моего приложения. Отлично объяснил