Как в 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
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.