Laravel 8 проверяет уникальность столбцов и строк при создании и обновлении

У меня есть 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 */
}

Проблема заключается в том, чтобы не использовать один и тот же адрес электронной почты в трех полях ввода моей формы?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
0
0
124
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете использовать правило 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 */
        }
Ответ принят как подходящий

Способ 1

Самый простой способ — использовать правило проверки 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,
],

Способ 2

Я вижу, вы проходите проверку в классе 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 тоже кажется отличным, но это слишком много для моего приложения. Отлично объяснил

Aciddiz 14.12.2020 20:34

Рад, что смог помочь 😊

David Grzyb 14.12.2020 22:04

Другие вопросы по теме