Laravel 4 - как использовать уникальное правило проверки/уникальные столбцы с мягкими удалениями?
Предположим, вы пытаетесь создать нового пользователя с моделью пользователя (с помощью мягких удалений), имеющей уникальное правило для этого адреса электронной почты, но в базе данных есть разбитый пользователь.
При попытке проверить новые пользовательские данные вы получите ошибку проверки из-за существующего письма.
Я сделал некоторую дополнительную проверку в моих контроллерах, но разве было бы неплохо иметь все это в Модели?
Предлагаете ли вы создать правило пользовательской проверки?
Поскольку я не нашел чистого решения сейчас, я интересуюсь тем, как другие решают эту проблему.
Ответы
Ответ 1
Это звучит как проблема с вашей бизнес-логикой, а не с технической проблемой.
Цель мягкого удаления заключается в том, чтобы разрешить восстановление записи с мягким удалением в будущем. Однако, если вашему приложению нужна уникальность электронной почты (что совершенно нормально), вы не захотите создавать нового пользователя с этим адресом электронной почты и иметь возможность восстановить старый, поскольку это противоречит требованию уникальности.
Итак, если есть мягкая удаленная запись с адресом электронной почты, для которого вы добавляете новую запись, вам следует вместо этого восстановить исходную запись и применить новую информацию к ней в качестве обновления, вместо того, чтобы пытаться обойти проверка уникальности для создания новой записи.
Ответ 2
Вы можете проверить дополнительные условия:
'unique:users,deleted_at,NULL'
Ответ 3
Это лучший подход
'email' => 'required|email|unique:users,email,NULL,id,deleted_at,NULL',
Он дает вам этот запрос
select count(*) as aggregate from `users` where `email` = ? and `deleted_at` is null
Ответ 4
Laravel предлагает " Дополнительные места размещения".
Мое правило проверки url (из метода модели update) выглядит следующим образом:
$rules['url'] = 'required|unique:pages,url,'.$page->id.',id,deleted_at,NULL';
Это означает, что url должен быть уникальным, должен игнорировать текущую страницу и игнорировать страницы, где deleted_at
id not NULL
.
Надеюсь, что это поможет.
Ответ 5
Ваша модель Eloquent должна иметь набор свойств $softDeletes
. Если это так, то когда вы выполняете проверку WHERE, например User::where('username', 'jimbob')
, Eloquent автоматически добавит запрос WHERE deleted_at IS NULL
..., который исключает мягкие удаленные элементы.