Как в where выбрать за конкретный день?
        Есть поле, допустим стандартное publishedon с датой в unixtime.
Нужно через &where у &pdoResources выбрать строки только за определённый день.
Задача осложняется тем, что проверять нужно по дню, а в unixtime записано всё, включая минуты и секунды.
Вот мой нерабочий вариант, который передаётся в $scriptProperties, для наглядности я его упростил:
Как сформировать правильно запрос для вывода строк за весь конкретный день?
    
    
                                                                                
            Нужно через &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}Как сформировать правильно запрос для вывода строк за весь конкретный день?
Комментарии: 7
$where="publishedon BETWEEN $unix_begin AND $unix_end AND published=1"            
                Спасибо! Почему-то так и думал что именно ты ответишь на такой вопрос! ;)
А как мне этот запрос запихнуть в pdoResources?
Я просто использую следующую конструкцию для передачи $where в pdoResources:
                    А как мне этот запрос запихнуть в pdoResources?
Я просто использую следующую конструкцию для передачи $where в pdoResources:
$scriptProperties['where'] = json_encode($where);
return $modx->runSnippet('pdoResources', $scriptProperties);            
                На вскидку и твой вариант должен работать. Просто я предложил альтернативу. Может у тебя нет документов, опубликованных на эту дату?
                    $where[]="publishedon BETWEEN $unix_begin AND $unix_end AND published=1";
$scriptProperties['where'] = json_encode($where);
return $modx->runSnippet('pdoResources', $scriptProperties);            
                Если просто вставить твой код в параметр &where у pdoResources, то вроде бы работает… Но!
Вообще-то, раскрою все карты для полного понимания.
Я вывожу через обёртку для 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-запрос из получившегося массива…            
                Вот ещё вариант
                    $where[]="FROM_UNIXTIME(publishedon, '%d-%m-%Y') LIKE '{$v}' AND published=1";
$scriptProperties['where'] = json_encode($where);
return $modx->runSnippet('pdoResources', $scriptProperties);            
                Возможно вариант с LIKE получится использовать в массиве, сейчас попробую…            
                    date_format(from_unixtime(publishedon), '%Y-%m-%d') = $v            
                            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.