У меня есть следующая структура таблицы базы данных для таблицы 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