Выдано 126235 лицензий

Построитель запросов QueryBuilder

Re: Построитель запросов QueryBuilder
#
Arkadiy
Огромное спасибо за быстрый ответ, по п. 1 почему-то и с ошибкой работает, а п.2 сейчас попробую.

ПрофильЦитировать выделенное10.11.2012 15:18:41 • Сообщений: 134
Re: Построитель запросов QueryBuilder
#
Arkadiy
В селекте сделал как вы указали
получил ошибку
Query error 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')) AS `alpha` FROM `shop_items` WHERE `active` = 1 AND `deleted` = 0 AND `sho' at line 3. Query: SELECT DISTINCT UCASE(LEFT(`name, 1`)) AS `alpha` FROM `shop_items` WHERE `active` = 1 AND `deleted` = 0 AND `shop_id` = 3

ПрофильЦитировать выделенное10.11.2012 15:21:39 • Сообщений: 134
Re: Построитель запросов QueryBuilder
#
Arkadiy
А п.2 помог, еще раз большое спасибо.

ПрофильЦитировать выделенное10.11.2012 15:27:42 • Сообщений: 134
Re: Построитель запросов QueryBuilder
#
hostcms
Модератор
Пожалуйста. По п. 1 там также нужно Core_QueryBuilder::expression() для сложного выражения использовать.

ПрофильЦитировать выделенное10.11.2012 16:31:52 • Сообщений: 16276
Re: Построитель запросов QueryBuilder
#
Stepan0v
Помогите объединить два фильтра по допсвойствам. Пробовал по-разному, но что-то делаю не так.

Допсвойства в разных таблицах: property_value_texts и property_value_ints
$Informationsystem_Controller_Show
   ->informationsystemItems()
   ->queryBuilder()
   ->leftJoin('informationsystem_item_properties', 'informationsystem_items.informationsystem_id', '=', 'informationsystem_item_properties.informationsystem_id')
   ->leftJoin('property_value_texts', 'informationsystem_items.id', '=', 'property_value_texts.entity_id',
      array(
         array('AND' => array('informationsystem_item_properties.property_id', '=', Core_QueryBuilder::expression('`property_value_texts`.`property_id`')))
      )
   )
   ->leftJoin('property_value_ints', 'informationsystem_items.id', '=', 'property_value_ints.entity_id',
      array(
         array('AND' => array('informationsystem_item_properties.property_id', '=', Core_QueryBuilder::expression('`property_value_ints`.`property_id`')))
      )
   )


Дальше есть один фильтр
// Идентификатор дополнительного свойства
->where('informationsystem_item_properties.property_id', '=', 82)
// Если есть текст
->where('property_value_texts.value', '<>', '')


И есть второй фильтр
// Идентификатор дополнительного свойства
->where('informationsystem_item_properties.property_id', '=', 109)
// Значание дополнительного свойства
->where('property_value_ints.value', '=', '1953')


По отдельности они работают и выдают пересекающиеся значения.
А вместе объединить не могу. Ничего не выдает.
Eсли если поставить ->setOr(), то выдает объединение, значит с данными всё в порядке.

ПрофильЦитировать выделенное25.11.2012 13:09:43 • Сообщений: 216
Re: Построитель запросов QueryBuilder
#
hostcms
Модератор
Блоки с указанием св-ва и значения идут через OR!
// Идентификатор дополнительного свойства
         ->where('informationsystem_item_properties.property_id', '=', 19)
         // Значание дополнительного свойства
         ->where('property_value_ints.value', '=', '123')

далее используете having с count, где значение равно количеству задействованных свойств, пример в соседней теме http://www.hostcms.ru/forums/2/7122/

ПрофильЦитировать выделенное25.11.2012 19:27:31 • Сообщений: 16276
Re: Re: Построитель запросов QueryBuilder
#
Stepan0v
Спасибо! Получилось. Забыл ограничить.

ПрофильЦитировать выделенное25.11.2012 22:56:40 • Сообщений: 216
Re: Построитель запросов QueryBuilder
#
bystritskiy.igor
Подскажите, пожалуйста, как составить на queryBuilder следующий запрос:
SELECT *
FROM `shop_items`
WHERE `shop_id` = '3'
AND `modification_id` != '0'
AND `deleted` = '0'
AND `showed` = '0'
AND `deleted` = 0
HAVING (
   $dateFrom BETWEEN `start_datetime` AND `end_datetime`
   OR
   $dateTo BETWEEN `start_datetime` AND `end_datetime`
)

где $dateFrom = '2013-08-01 00:00:00', $dateTo = '2013-08-30 00:00:00'.
SQL-запрос тестировал на СУБД -- работает.

Пробовал так:
$oModifications = Core_Entity::factory('Shop', Core_Array::get(Core_Page::instance()->libParams, 'shopId'))
   ->Shop_Items;

$oModifications
  ->queryBuilder()
  ->where('shop_items.modification_id', '!=', '0')
  ->where('shop_items.deleted', '=', '0')
  ->where('shop_items.showed', '=', '0')
  ->havingOpen()
    ->having($dateFrom, 'BETWEEN', array('shop_items.start_datetime', 'shop_items.end_datetime'))
    ->setOr()
    ->having($dateTo, 'BETWEEN', array('shop_items.start_datetime', 'shop_items.end_datetime'))
  ->havingClose();

но конструкция having BETWEEN явно не правильная.

ПрофильЦитировать выделенное14.02.2013 17:23:48 • Сообщений: 30
Re: Построитель запросов QueryBuilder
#
hostcms
Модератор
brokerUA,
так какая ошибка и что именно неправильно в сгенерированном SQL получается?

ПрофильЦитировать выделенное14.02.2013 17:32:55 • Сообщений: 16276
Re: Re: Построитель запросов QueryBuilder
#
bystritskiy.igor
Переменную `2013-05-01 00:00:00` -- понимает как колонку, а 'start_datetime' и 'end_datetime' как входящие текстовые значения. Если расставить кавычки наоборот, в виде :
...
'2013-05-01 00:00:00' BETWEEN `shop_items`.`start_datetime` AND `shop_items`.`end_datetime`
...
то код выполняется в СУБД.

Ошибка:
Exception: Query error 1054: Unknown column '2013-05-01 00:00:00' in 'having clause'. Query: SELECT * FROM `shop_items` WHERE `shop_items`.`shop_id` = '3' AND `shop_items`.`modification_id` != '0' AND `shop_items`.`deleted` = '0' AND `shop_items`.`showed` = '0' AND `shop_items`.`deleted` = 0 HAVING ( `2013-05-01 00:00:00` BETWEEN 'shop_items.start_datetime' AND 'shop_items.end_datetime' OR `2013-05-30 00:00:00` BETWEEN 'shop_items.start_datetime' AND 'shop_items.end_datetime' )
29 modules\core\exception.php
635 modules\core\database\mysql.php
62 modules\core\querybuilder\statement.php
472 modules\core\orm.php
375 modules\core\entity.php
513 hostcmsfiles\lib\lib_43\lib_43.php
268 modules\lib\model.php
100 modules\core\page.php
18 templates\template11\template.htm
83 modules\template\model.php
100 modules\core\page.php
102 templates\template1\template.htm
83 modules\template\model.php
100 modules\core\page.php
363 modules\core\command\controller\default.php
188 modules\core\router\route.php
205 index.php

ПрофильЦитировать выделенное14.02.2013 17:55:49 • Сообщений: 30
Авторизация