При реализации разного рода задач приходится нередко использовать API, а конкретнее - класс selector.
Все бы было ничего, но в процессе решения одной из задач столкнулся со следующими проблемами:
1. Методы фильтрации less, more и т.п., применяемые к полю, имеющему тип "Дата", работают некорректно.
Логичнее всего, как я подумал сначала, подавать дату в timestamp, ведь именно в таком виде она и хранится в БД, однако в таком случае возвращается вообще 0 объектов (хотя по timestamp та же сортировка выполняется корректно).
Вставки кода приведу только с проблемными местами, чтобы не было ничего лишнего:
$element_ldate="1359333515";
$pages = new selector('pages');
$pages->types('hierarchy-type')->name('catalog', 'object');
$pages->where('1c_exchange_date')->more($element_ldate);
При указывании даты в формете "Y-m-d H:i:s" (такой, как мы видим ее в админке, по сути, согласно заданному формату default-date-format в config.ini, секция system) отбор работает, но только с точностью до минут. Для решения задачи учитывать секунды обязательно.
$element_ldate="2013-01-28 00:38:35"";
$pages = new selector('pages');
$pages->types('hierarchy-type')->name('catalog', 'object');
$pages->where('1c_exchange_date')->more($element_ldate);
С less, а также с дополнительной приставкой равенства eq ситуация такая же.
А between, насколько я помню, наоборот, корректно работает с timestamp, а вот такой формат, увы, не переваривает. Естественно, ничего из этого не документировано.
2. Попробовал применить методы less и more для системного поля id.
Тут просто выводим объекты каталога и сортируем их по id по убыванию.
$pages = new selector('pages');
$pages->types('hierarchy-type')->name('catalog', 'object');
$pages->order('id')->desc();
На выходе если выведем id, получим следующее:
3136, 3135, 3134, ..., 258, 257, 256.
Итого: 2659 объектов.
Далее, предположим, мне нужно дополнительно отсечь еще и все объекты, id у которых меньше 3136. Дописываем заветную строчку:
$pages = new selector('pages');
$pages->types('hierarchy-type')->name('catalog', 'object');
$pages->where('id')->less(3136);
$pages->order('id')->desc();
На выходе получаем:
2806, 2805, 2804, ..., 258, 257, 256.
Итого: 2462 объекта
В итоге погрешность составляет 2659-2462=197~200 объектов при попытке отсеять всего лишь 1 объект.
Для more ситуация ничуть не лучше.
$pages = new selector('pages');
$pages->types('hierarchy-type')->name('catalog', 'object');
$pages->where('id')->more(1000);
$pages->order('id')->desc();
3136, 3135, 3134, ..., 674, 673, 672.
Если вместо 1000 будет, к примеру, 500, то массив вообще остается без изменений, т.е. конечный объект по-прежнему имеет id 256.
C дополнительной приставкой равенства eq ситуация такая же.
Подскажите, что я делаю не так, или действительно такая ошибка имеет место? Может быть она появляется только для поля id?
P.S. Тестирую в standalone файле, результаты вывожу в foreach.