Как проверить уникальность двух столбцов, в которых один столбец может быть пустым в laravel - PullRequest
0 голосов
/ 19 апреля 2020

У меня есть следующая структура таблицы базы данных для таблицы agents

+--------------------------+---------------------+------+-----+---------+----------------+
| Field                    | Type                | Null | Key | Default | Extra          |
+--------------------------+---------------------+------+-----+---------+----------------+
| id                       | bigint(20) unsigned | NO   | PRI | NULL    | auto_increment |
| first_name               | varchar(255)        | NO   |     | NULL    |                |
| phone                    | varchar(255)        | NO   | MUL | NULL    |                |
| active                   | tinyint(1)          | YES  |     | NULL    |                |
+--------------------------+---------------------+------+-----+---------+----------------+

поля phone и active имеют уникальное ограничение в 2 столбца, то есть только один phone должен быть в активном состоянии сразу. столбец active является логическим значением, допускающим значение NULL, потому что если я введу 0 для ложного значения, то уникальное ограничение 2 столбцов не будет выполнено, если есть два неактивных числа phone (так как null! = null, он отлично работает на уровень базы данных, когда я вручную вставляю его в базу данных). Я надеюсь, что здесь все ясно.

Проблема

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

вот мое правило проверки

$request->validate([
   'first_name'=> 'required',
   'active' => 'required',
   'phone' => [
       'required', 
       Rule::unique('delivery_agents')->using(function ($query) use ($request) {
             $query->where('phone', $request->phone)
                 ->where('active', $request->active ? $request->active : null); // explicitly checking against null value or true not 0
       })
    ],
 ]);

Но правило проверки не выполняется, когда есть один неактивный номер телефона (ie: phone номер с active = null)

Я полагаю, что причина в том, что правило проверки проверяет номер телефона с active = null, и, поскольку существует одна подобная запись, оно выдает исключение из проверки. Как мне это смягчить.

Нашел пост здесь , но опять же это то же самое, что я написал в вопросе.

Использование Laravel 6 и Mysql 8

Ответы [ 2 ]

0 голосов
/ 19 апреля 2020

Достаточно проверить ненулевое значение, поскольку у вас есть только 1 и NULL в качестве возможных значений для active

'phone' => [
    'required', 
    Rule::unique('delivery_agents')->where(function ($query) use ($request) {
         return $query->where('phone', $request->phone)
               ->whereNotNull('active'); 
    })
],
0 голосов
/ 19 апреля 2020

здесь вы go

$request->validate([
   'first_name'=> 'required',
   'active' => 'required',
   'phone' => [
       'required', 
       Rule::unique('delivery_agents')->using(function ($query) use ($request) {
             $query->where('phone', $request->phone)
                 ->where(function ($query) {
                      $query->where('active', 1)
                            ->orWhereNull('active');
}); 
       })
    ],
 ]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...