Я запутался насчет фильтрации полей, таких как created_at
или же updated_at
в GridView. Yii2 предлагает использовать метку времени Unix, сохраненную в целочисленном поле в базе данных MySQL. Все хорошо, но как я могу отфильтровать эти значения? Если я хочу отфильтровать только дату — нужно ли добавлять в метод поиска что-то вроде следующего?
$query->andFilterWhere([
'DATE(FROM_UNIXTIME('.$this->tableName() . '.created_at))' => $this->created_at]);
Или использовать FROM_UNIXTIME
с конкретным форматом? Конечно, это можно сделать так, но сравнение поля означает преобразование всех значений в дату, а затем сравнение.
Я делаю это неправильно?
Вы не делаете это неправильно, но если вы хотите фильтровать по временной метке, у вас есть как минимум два варианта.
Ваше замечание о том, что это можно сделать с помощью преобразования всех значений в дату и сравнения их, является первым вариантом (MySql конвертирует каждую отметку времени в дату). (Но вам не нужно конвертировать $this->created_at
на свидание, а?).
Со вторым вариантом вы конвертируете $this->created_at
значение до самого низкого и самого высокого значения метки времени Unix и используйте предложение фильтра SELECT BETWEEN. В этом случае вам нужны только два преобразования, которые выполняются Php (преобразование в самое низкое и самое высокое значение даты), а MySql просто выполняет проверку диапазона.
// date to search
$date = DateTime::createFromFormat('m/d/Y', '10/27/2014');
$date->setTime(0,0,0);
// set lowest date value
$unixDateStart = $date->getTimeStamp();
// add 1 day and subtract 1 second
$date->add(new DateInterval('P1D'));
$date->sub(new DateInterval('PT1S'));
// set highest date value
$unixDateEnd = $date->getTimeStamp();
$query->andFilterWhere(
['between', 'created_at', $unixDateStart, $unixDateEnd]);
Других решений пока нет …