Здравствуйте, делаю сброс пароля. Нужно проверить есть ли юзер с таким то email и если есть, выбрать его и записать ему код сброса пароля. У меня есть два решения:
№1
С помощью правил модели проверить существование юзера с таким email и в случае успеха, выбрать его из БД в контроллере и сохранить с кодом сброса.
Итог: имеем минимум 2 запроса к БД.
№2
Сделать запрос прямо в контроллере если есть запись тут же сохранить с кодом сброса, если нет, то нужно записать в модель ошибку.
Итог: имеем минимум 1 запрос к БД.
Больше склоняюсь ко второму варианту, но не уверен правильно ли делать какие бы то ни было проверки в контроллере.
Ну во первых экономить лишний запрос к базе на редко используемом функционале сброса пароля, это наверное слишком.
Но гораздо интереснее почему в 1-м варианте у вас возникла идея
Что за модель?
Контроллер все равно ищет некую запись, если не находит (null), то или кинуть CHttpException или создать пустую модель, установить её ошибку "такого юзера нет" и отдать в представление, пусть там отображается.
Валидаторы нужны для проверки данных, введенные пользователями перед сохранением модели. А вам нужно проверить существует ли пользователь. В такой задаче пользоватся валидатором может и DRY но как-то странно выглядит, все равно что использовать валидатор "число должно быть больше 10" в своем коде, вместо написания простого условия if(x<10) …
Вообще наверное вам лучше написать UPDATE code=’…’ WHERE email=’…’ (не обязательно чистым SQL) и добавлять в flash ошибку “Юзер не найден” если affectedRows=0