JQ: Автоматизация поиска и сортировки
Всего для выдачи результата необходимо минимум два запроса к БД:
- Count-запрос. Здесь же считаются суммы для колонок, у которых 'sum' => true.
- Основной запрос.
В основном SELECT-запросе ($this->query) используется два placeholder'а - {fields} и {where}.
Подробнее:
{fields} - собирается на основании $this->cols, ключа 'db'. В count-запросе подставляется 'count(*)'.
{where} - собирается на основании $this->cols и данных из $this->request. Если поиск не осуществлялся, то подставляет 'true'.
К основному запросу автоматом добавляются ORDER BY, LIMIT и OFFSET на основании входящих данных.
В данный момент поддерживается только автоматический поиск с прямой передачей параметров в запросе. Это filterToolbar, это простой formSearch, это прямая передача параметров через serializeGridData или setPostDataItem. Поддержка других типов поиска появится тогда, когда в этом возникнет надобность.
Указание операторов
При поиске по датам и числам поддерживается указание префиксов-операторов.
Например:
>16 (больше 16) >=17 (больше-равно 17) <>15.02.2010 (не равно 15.02.2010)
Прямо так и вводим в filterToolbar.
Оператор по умолчанию - '=' (равенство).
Строковые значения ищутся оператором ILIKE '%{val}%'
Поиск "по умолчанию"
Чтобы упростить жизнь, было сделано следующее.
Все переменные дополнительные переменные (кроме section и act), которые использовались в момент создания грида, будут добавлены к нему в URL. Следовательно, будут влиять на поиск. Пример можно посмотреть в "Статистике внешних сервисов". Там передается &cat=X.
Особый поиск
Для сложных случаев возможно опускать {where} и вручную формировать условия, либо использовать комбинацию из {where} и своих условий. Живой пример:
$transfer_id = isset($this->request['transfer_id']) ? intval($this->request['transfer_id']) : 0;
$this->query = "
SELECT {fields}
FROM payment_bnd_order b
JOIN payment_tbl_transfer pt ON (b.transfer_id=pt.id)
JOIN tbl_order o ON (b.order_id=o.id)
JOIN tbl_order_payment p ON (b.order_id=p.order_id AND pt.payment_type=p.payment_type)
JOIN lst_payment_types lp ON (p.payment_type=lp.id)
LEFT JOIN (
SELECT order_id, sum(sum) as sum_prev
FROM payment_bnd_order
WHERE transfer_id != $transfer_id
GROUP BY order_id
) s ON (b.order_id = s.order_id)
WHERE b.transfer_id=$transfer_id AND {where}
";
Работа с диапазонами дат
См. refstat/jq_refstat.php

0 комментариев
Рекомендуемые комментарии
Комментариев для отображения не найдено.