Как в where выбрать за конкретный день?

Есть поле, допустим стандартное publishedon с датой в unixtime.
Нужно через &where у &pdoResources выбрать строки только за определённый день.
Задача осложняется тем, что проверять нужно по дню, а в unixtime записано всё, включая минуты и секунды.

Вот мой нерабочий вариант, который передаётся в $scriptProperties, для наглядности я его упростил:
$v = '08-02-2016';
$unix_begin = strtotime($v); // 08-02-2016 00:00:00
$unix_end = strtotime($v.' 23:59:59'); // 08-02-2016 23:59:59
$where['publishedon:>='] = $unix_begin;
$where['AND:publishedon:<='] = $unix_end;
$where['published'] = 1;
print json_encode($where);
В результате получается следующий json, который в pdoResources ничего не выводит:
{"publishedon:>=":1454882400,"AND:publishedon:<=":1454968799,"published":1}

Как сформировать правильно запрос для вывода строк за весь конкретный день?
Василий Столейков
08 февраля 2016, 07:10
modx.pro
4
2 078
0
Поблагодарить автора Отправить деньги

Комментарии: 7

Сергей Шлоков
08 февраля 2016, 13:55
1
+1
$where="publishedon BETWEEN $unix_begin AND $unix_end AND published=1"
    Василий Столейков
    08 февраля 2016, 14:44
    0
    Спасибо! Почему-то так и думал что именно ты ответишь на такой вопрос! ;)
    А как мне этот запрос запихнуть в pdoResources?
    Я просто использую следующую конструкцию для передачи $where в pdoResources:
    $scriptProperties['where'] = json_encode($where);
    return $modx->runSnippet('pdoResources', $scriptProperties);
      Сергей Шлоков
      08 февраля 2016, 14:52
      0
      На вскидку и твой вариант должен работать. Просто я предложил альтернативу. Может у тебя нет документов, опубликованных на эту дату?
      $where[]="publishedon BETWEEN $unix_begin AND $unix_end AND published=1";
      $scriptProperties['where'] = json_encode($where);
      return $modx->runSnippet('pdoResources', $scriptProperties);
        Василий Столейков
        08 февраля 2016, 15:15
        0
        Если просто вставить твой код в параметр &where у pdoResources, то вроде бы работает… Но!

        Вообще-то, раскрою все карты для полного понимания.
        Я вывожу через обёртку для pdoResources данные из кастомной таблицы:
        [[!orderResources?
            &element=`orderResources`
            &loadModels=`orders_external`
            &class=`BazOrders1External`
            &filters=`export_country,import_country,date_from,transport_type`
            &tpl=`@INLINE {{+idx}}. {{+id}}
        `
            &where=`{ 'published': 1 }`
        ]]
        А в обёртке orderResources прохожусь по всем GET-параметрам и по разрешенным из них составляет where-запрос для pdoResources. Если в where уже есть что-то, то он должен ему добавить
        if(!empty($scriptProperties['filters'])) {
            $where = array();
            $filters = explode(',',$scriptProperties['filters']);
            if(!empty($scriptProperties['where'])) {
                $where = (array) json_decode($scriptProperties['where']);
                foreach($_GET as $key => $v) {
                    if (in_array($key, $filters)){
                        if($key == 'date_from') {
                            $unix_begin = strtotime($v);
                            $unix_end = strtotime($v.' 23:59:59');
                            if(isset($where['published'])) {
                                $where_ext = ' AND published=1';
                            }
                            $where[]="date_from BETWEEN $unix_begin AND $unix_end$where_ext"; // тут попробовал добавить существующий параметр в ту же строку
                            
                        } else {
                            $where[$key] = $v;
                        }
                    }        
                }        
            } else {
                foreach($_GET as $key => $v) {
                    if (in_array($key, $filters)){
                        if($key == 'date_from') {
                            $unix_begin = strtotime($v);
                            $unix_end = strtotime($v.' 23:59:59');
                            $where="date_from BETWEEN $unix_begin AND $unix_end";
                        } else {
                            $where[$key] = $v;
                        }
                    }        
                }        
            }
            $scriptProperties['where'] = json_encode($where);
        }
        return $modx->runSnippet('pdoResources', $scriptProperties);
        Итого: у меня каждый раз в зависимости от GET-параметров должен быть разный WHERE. Ты предлагаешь одной строкой записанной уже, а мне похоже нужно составлять json-запрос из получившегося массива…
        Сергей Шлоков
        08 февраля 2016, 15:13
        0
        Вот ещё вариант
        $where[]="FROM_UNIXTIME(publishedon, '%d-%m-%Y') LIKE '{$v}' AND published=1";
        $scriptProperties['where'] = json_encode($where);
        return $modx->runSnippet('pdoResources', $scriptProperties);
          Василий Столейков
          08 февраля 2016, 15:17
          0
          Возможно вариант с LIKE получится использовать в массиве, сейчас попробую…
      Fi1osof
      09 февраля 2016, 13:00
      -1
      date_format(from_unixtime(publishedon), '%Y-%m-%d') = $v
        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
        7