Проблема не имеет ничего общего с SoftDeletes
, это проблема проверки. Правило проверки unique
является особенным, потому что в случае обновления ему необходимо знать, какую запись он может игнорировать при выполнении проверки. В фоновом режиме правило выполняет запрос SQL, например
IF EXISTS (
SELECT id
FROM my_table
WHERE name = 'some value'
)
SELECT 1
ELSE
SELECT 0
(это может быть не точный запрос, но похожий).
Как видите, запрос не учитывает, выполняете ли вы обновление или нет. Поскольку ваша сущность уже существует, она вернет 1
и, следовательно, провалит проверку, поскольку считает, что проверяемое значение не является уникальным.
Но на самом деле есть способ заставить проверку работоспособности обновлений. Вам просто нужно добавить id
существующего объекта (который проверяется) в качестве третьего параметра к правилу проверки. Так что ваши правила должны выглядеть примерно так:
$rules = [
'name' => 'unique:my_table,name,'.$id
];
Обратите внимание, что для правила проверки unique
есть и второй параметр - столбец таблицы базы данных, в которой вы хотите выполнить поиск.
Edit:
В случае, если ограничение уникальности относится только к не удаленным записям, что означает, что уникальное значение может быть использовано повторно, если другие вхождения того же значения помечены как удаленные, тогда может потребоваться добавить дополнительное предложение where()
к правилу проверки unique
. Для этого четвертому параметру необходимо задать имя столбца identifier
, а затем мы можем добавить дополнительные предложения where
в виде пар из двух параметров.
$rules = [
'name' => 'unique:my_table,name,'.$id.',id,deleted_at,NULL'
];
Это добавит where('deleted_at', 'NULL')
(или whereNull('deleted_at')
) к запросу.