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 комментариев
Рекомендуемые комментарии
Комментариев для отображения не найдено.