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

#
Re: Построитель запросов QueryBuilder
Огромное спасибо за быстрый ответ, по п. 1 почему-то и с ошибкой работает, а п.2 сейчас попробую.
#
Re: Построитель запросов QueryBuilder
В селекте сделал как вы указали
получил ошибку
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
#
Re: Построитель запросов QueryBuilder
А п.2 помог, еще раз большое спасибо.
Модератор
#
Re: Построитель запросов QueryBuilder
Пожалуйста. По п. 1 там также нужно Core_QueryBuilder::expression() для сложного выражения использовать.
#
Re: Построитель запросов QueryBuilder
Помогите объединить два фильтра по допсвойствам. Пробовал по-разному, но что-то делаю не так.

Допсвойства в разных таблицах: 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(), то выдает объединение, значит с данными всё в порядке.
Модератор
#
Re: Построитель запросов QueryBuilder
Блоки с указанием св-ва и значения идут через OR!
// Идентификатор дополнительного свойства
         ->where('informationsystem_item_properties.property_id', '=', 19)
         // Значание дополнительного свойства
         ->where('property_value_ints.value', '=', '123')

далее используете having с count, где значение равно количеству задействованных свойств, пример в соседней теме http://www.hostcms.ru/forums/2/7122/
#
Re: Re: Построитель запросов QueryBuilder
Спасибо! Получилось. Забыл ограничить.
#
Re: Построитель запросов QueryBuilder
Подскажите, пожалуйста, как составить на 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 явно не правильная.
Модератор
#
Re: Построитель запросов QueryBuilder
brokerUA,
так какая ошибка и что именно неправильно в сгенерированном SQL получается?
#
Re: Re: Построитель запросов QueryBuilder
Переменную `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
Авторизация