Как сделать проверку на наличие данных в бд из rules?

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Artur_Hopf
Сообщения: 19
Зарегистрирован: 2019.02.28, 11:18

Как сделать проверку на наличие данных в бд из rules?

Сообщение Artur_Hopf »

Добрый день, есть такая форма:

Код: Выделить всё

<?php $form = ActiveForm::begin(); ?>
        <?= $form->field($model, 'name')->textarea(['rows' => '3'])->label('Введите описание операции:') ?>
        <?= Html::submitButton('Добавить', ['class' => 'btn btn-primary', 'name' => 'login-button']) ?>
 <?php ActiveForm::end(); ?>
И есть такая модель:

Код: Выделить всё

class ModelCheckList extends ActiveRecord{

    public $name;

    public function rules(){
        return [
            ['name', 'required', 'message'=>'Не заполнено поле.'],
            ['name', 'string', 'min' => 4, 'tooShort'=>'Описание должно содержать не менее 4 символов.'],
            ['name', 'string', 'max' => 500, 'tooLong'=>'Описание должно содержать не более 500 символов.'],
        ];
    }
хотел сюда добавить проверку на наличие записи $name из формы в таблице бд.

для проверки работы написал так:

Код: Выделить всё

class ModelCheckList extends ActiveRecord{

    public $name;

    public function rules(){
        return [
            ['name', 'required', 'message'=>'Не заполнено поле.'],
            ['name', 'string', 'min' => 4, 'tooShort'=>'Описание должно содержать не менее 4 символов.'],
            ['name', 'string', 'max' => 500, 'tooLong'=>'Описание должно содержать не более 500 символов.'],
            ['name', 'unique', 'targetClass' => ModelCheckList::checkNameOperations(), 'message' => 'Данное описание уже существует']
        ];
    }
    
    public function checkNameOperations(){
         return false;
    }
    
Думалось если функция вернет false, то сработает ошибка. Но не работает. Подскажите как правильно реализовать поиск совпадении из формы?

Поиск нужно произвести в таблице с названием CheckListNameOperations а столбец называется name. Думалось после проваерки дописать так, но кажется я не правильно понимаю принцип работы unique:

Код: Выделить всё

class ModelCheckList extends ActiveRecord{

    public $name;

    public function rules(){
        return [
            ['name', 'required', 'message'=>'Не заполнено поле.'],
            ['name', 'string', 'min' => 4, 'tooShort'=>'Описание должно содержать не менее 4 символов.'],
            ['name', 'string', 'max' => 500, 'tooLong'=>'Описание должно содержать не более 500 символов.'],
            ['name', 'unique', 'targetClass' => ModelCheckList::checkNameOperations(), 'message' => 'Данное описание уже существует']
        ];
    }

   public function checkNameOperations(){
        $query = new Query;
        $name = preg_replace("/  +/"," ", trim($this->name));
        $query->from('CheckListNameOperations');
        $query->where(['name' => $name]);
        $result = $query->count();
        if($result > 0){
           return false;
        }else{
           return true;
        }
    }
}    
Подскажите пожалуйста как правильно?
aleksandr.chirkov
Сообщения: 9
Зарегистрирован: 2019.02.24, 13:31

Re: Как сделать проверку на наличие данных в бд из rules?

Сообщение aleksandr.chirkov »

Минутку, если у вас $model (во view), это экземпляр класса ModelCheckList, то Вам достаточно просто написать:

['name', 'unique'] - и все, Валидация будет проходить на сервере, после submit и выводить что такое значение уже есть в столбце name

Это при условии, что у Вас таблица с названием CheckListNameOperations - работает с моделью ModelCheckList. (то есть есть public static tableName, который возвращает имя CheckListNameOperations таблицы)

Если Вы хотите брать столбец для валидации из другой модели, то можно воспользоваться вот этим способом:
https://code.tutsplus.com/ru/tutorials/ ... -cms-23427

[['name''], 'exist','targetClass'=>'\app\models\User','message'=>Yii::t('app','Sorry, that person hasn\'t registered yet')],

или можно посмотреть тут:

https://www.yiiframework.com/doc/guide/ ... tors#exist
Ответить