Валидатор ModelNotExists позволяет проверить отсутствие записи в базе данных. Это подойдет для тех случаев, когда вам нужно проверить отсутствие записи в таблице прежде чем её добавить. Например, с помощью этого валидатора, в форме регистрации пользователя вы можете проверить существует ли пользователь с введенным логином или нет.
Для работы этого валидатора вам потребуется существующая модель.
Поддерживаемые параметры
model: Класс модели, который будет использоваться для построения запроса к БД.
field: Столбец в БД по которому будет осуществляться поиск записи.
exclude: Параметры для задания условий исключения из выборки. Может содержать анонимную функцию или массив с полями field и value.
Примеры использования
// Массив полей и значений$data=['test'=>'[email protected]',];// Настройки валидатора$rules=['test'=>['ModelNotExists'=>['model'=>\Johncms\Users\User::class,'field'=>'mail','exclude'=>staticfunction($query){return$query->where('name','!=','admin')->where('id','!=',1);},],],];// Валидация$validator=new\Johncms\Validator\Validator($data,$rules);if($validator->isValid()){echo'OK';}else{d($validator->getErrors());}
В примере выше выполняется проверка наличия в таблице users пользователя с полем mail, содержащим [email protected]. При этом из выборки исключаются строки с name = admin и id = 1. Для расширения запроса на выборку используется анонимная функция. Она позволяет дополнять запрос любыми условиями.
Валидатор выполнит следующий запрос:
Рассмотрим более простой пример, где в параметр exclude передается массив:
Если вам не требуется сложное условие для исключения записей из выборки, то вы можете использовать такой вариант задания исключений. При таких настройках валидатор выполнит следующий запрос:
Ну и давайте рассмотрим минимальный вариант использования, вообще без исключений.
При таких настройках валидатор просто проверит наличие записи с mail = [email protected]. Если запись будет найдена, то валидатор вернёт ошибку. Если нет, проверка пройдет успешно.
Запрос, который выполнит валидатор при этих настройках будет таким: