Yii2 — сетка просмотра фильтра Unix Timestamp

Я запутался насчет фильтрации полей, таких как created_at или же updated_at в GridView. Yii2 предлагает использовать метку времени Unix, сохраненную в целочисленном поле в базе данных MySQL. Все хорошо, но как я могу отфильтровать эти значения? Если я хочу отфильтровать только дату — нужно ли добавлять в метод поиска что-то вроде следующего?

$query->andFilterWhere([
'DATE(FROM_UNIXTIME('.$this->tableName() . '.created_at))' => $this->created_at]);

Или использовать FROM_UNIXTIME с конкретным форматом? Конечно, это можно сделать так, но сравнение поля означает преобразование всех значений в дату, а затем сравнение.

Я делаю это неправильно?

3

Решение

Вы не делаете это неправильно, но если вы хотите фильтровать по временной метке, у вас есть как минимум два варианта.

  1. Преобразовать временную метку в запросе.
  2. Преобразуйте значение, по которому вы хотите фильтровать.

Ваше замечание о том, что это можно сделать с помощью преобразования всех значений в дату и сравнения их, является первым вариантом (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]);
4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]