Допустим, у меня в бд есть числовые поля value_from и value_to. Там хранятся значение вида value_from 1, value_to 3 первая запись. Вторая value_from 4, value_to 9 и так далее. Могу я как-то настроить валидацию так, чтобы ни один из этих диапазонов не пересекался друг с другом?
Если данные прошли валидацию, пишем в БД и обновляем кеш.
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;
}
Можешь, но мне кажется это лучше всего делать через запрос в базу.
Я предполагаю, что в модели стоят поля 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');
}
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
При использовании обычной загрузки файла(без multiple), имя файла записывается в нужный столбец в БД, но при загрузке множества файлов(с multiple)...
Всем доброго дня! Не получается сделать фильтр от минимального до максимального значенияУ меня есть контроллер в котором я сравниваю цену...
Пытаюсь разобраться в Google Sheets API на PHP 7В общем, как правильно заполнить range, чтобы получилось так?