Валидация диапазонов чисел Yii2

89
16 марта 2022, 23:10

Допустим, у меня в бд есть числовые поля value_from и value_to. Там хранятся значение вида value_from 1, value_to 3 первая запись. Вторая value_from 4, value_to 9 и так далее. Могу я как-то настроить валидацию так, чтобы ни один из этих диапазонов не пересекался друг с другом?

Answer 1
  1. Создаем отдельный метод для валидации
  2. Получаем все записи из таблицы (кеша) в массив
  3. Форичем проходим массив и проверяем, если from попадает в диапазон или to попадает в диапазон, то выходим из цикла с ошибкой
  4. Если данные прошли валидацию, пишем в БД и обновляем кеш.

    public function validateInterval($attribute, $params): bool
    {
        $intervals = Model::findAll(); // тут лучше брать из кеша
        foreach ($intervals as $interval) {
            if (($this->from >= $interval['from'] && $this->from <= $interval['to']) || ($this->to >= $interval['from'] && $this->to <= $interval['to'])) {
                return false;
            }
        }
        return true;
    }
    
Answer 2

Можешь, но мне кажется это лучше всего делать через запрос в базу.

Я предполагаю, что в модели стоят поля value_from и value_to. Запрос на проверку диапазонов можно сделать следующим методом:

SELECT * FROM tableName 
WHERE :value_from >= value_from and :value_from <= value_to -- проверяем чтобы значение не было в пределах существующего диапазона
    or :value_to >= value_from and :value_to <= value_to
    or :value_from < value_from and :value_to > value_to;  -- проверяем чтобы диапазон не обхватывал существующий диапазон

Где :value_from и :value_to - новые значения, которые возвращаются в форме.

Вызвать такую валидацию можно через custom function validation

public function rules() {
    return [
        ...
        [['value_from'], 'checkRange']
    ];
}
public function checkRange() {
    $q = self::find()->where( ... conditions here ...)->one();
    if(!empty($q)){
        $this->addError('something', 'something');
    }
}
READ ALSO
Как записать имена загружаемых файлов в одну строку или столбец БД?

Как записать имена загружаемых файлов в одну строку или столбец БД?

При использовании обычной загрузки файла(без multiple), имя файла записывается в нужный столбец в БД, но при загрузке множества файлов(с multiple)...

69
laravel @error(&#39;name&#39;) {{$message}}

laravel @error('name') {{$message}}

Есть форма, в которой делаю валидацию данных:

81
Фильтр цен от минимального до максимального. laravel

Фильтр цен от минимального до максимального. laravel

Всем доброго дня! Не получается сделать фильтр от минимального до максимального значенияУ меня есть контроллер в котором я сравниваю цену...

83
Как в Google Sheets API писать в разные диапазоны?

Как в Google Sheets API писать в разные диапазоны?

Пытаюсь разобраться в Google Sheets API на PHP 7В общем, как правильно заполнить range, чтобы получилось так?

66