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..., который исключает мягкие удаленные элементы.