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

Модератор
#
Построитель запросов QueryBuilder
Описание в документации: http://www.hostcms.ru/documentation/guide/modules/core/querybuilder/
#
Re: Построитель запросов QueryBuilder
$oCore_QueryBuilder_Insert = Core_QueryBuilder::insert('test_tab_edits')
         ->select('*')
         ->from('test_tabs')
         ->execute();
         ;
Вот такая вот ошибка возникает..

The method 'select' does not exist in the class 'Core_QueryBuilder_Statement'

Можно ли как-то через QueryBuilder внести напрямую код sql?
Модератор
#
Re: Построитель запросов QueryBuilder
31gorod писал(а):
The method 'select' does not exist in the class 'Core_QueryBuilder_Statement'

А где Вы там метод select нашли?

31gorod писал(а):
Можно ли как-то через QueryBuilder внести напрямую код sql?

через QB нет, в принципе Вам этого не должно хотеться вовсе.
#
Re: Построитель запросов QueryBuilder
Я подумал было что мне не должно этого хотеться, но все же как то нужно выполнить некий запрос

INSERT INTO <название таблицы> SELECT <имя столбца>,… FROM <название таблицы>

который таким образом выполнить не удается.
Сейчас я подумал, что вероятно я неправильно строю запрос и нужно сначала выполнить select а потом подставлять его в insert. Как же все таки выполнить этот запрос?
#
Re: Построитель запросов QueryBuilder
Подскажите пожалуйста как я могу просмотреть созданный в QueryBuilder запрос? Иногда что-то не ладится и хочется посмотреть что QueryBuilder запрашивает.
Модератор
#
Re: Построитель запросов QueryBuilder
echo Core_DataBase::instance()->getLastQuery();
#
Re: Построитель запросов QueryBuilder
Спасибо!
#
Re: Построитель запросов QueryBuilder
Вот что получилось в итоге:
Функция фильтрации элементов информационной системы по нескольким однородным свойствам.

public static function filterItems($informationSystem, $tableName, $search)
    {
        If (count($search) > 0) {
            $idsArray = array();
            $props = array();

            $query = Core_QueryBuilder::select('property_value_ints.entity_id', 'property_value_ints.property_id')
                ->from('property_value_ints')
                ->join('properties', 'properties.id', '=', 'property_value_ints.property_id')
                ->join('informationsystem_item_properties', 'informationsystem_item_properties.property_id', '=', 'property_value_ints.property_id')
                ->where('informationsystem_item_properties.informationsystem_id', '=', (int)$informationSystem)
                ->open();
            //в цикле задаем значения для выборки по каждому из свойств
            foreach ($search as $k => $v) {
                if (count($v) == 0 || (count($v) == 1 && $v[0] == '')) {
                    continue;
                }
                $query
                    ->open()
                        ->where('properties.list_id', '=', $k)
                        ->setAnd()
                        ->where('value', 'IN', $v)
                    ->close()
                    ->setOr();
            }
            $query
                ->setOr()
                ->close();

            $data = $query->execute()->asAssoc()->result();

            //делаем двухмерный массив с ключами по иду свойства
            foreach ($data as $k => $v) {
                $props[$v['property_id']][] = $v['entity_id'];
            }

            //вычисляем пересечение подмассивов свойств
            $i = 0;
            foreach ($props as $v) {
                if ($i == 0) { //если есть результат в первой итерации присваиваем его $idsArray
                    $idsArray = $v;
                    $i = 1;
                } else { //в следующих итерациях вычисляем только те иды, которые есть и там и там
                    $idsArray = array_intersect($idsArray, $v);
                }
            }
            $idsArray = array_unique($idsArray);
            //var_dump($idsArray);
            return $idsArray;
        } else {
            return 'all';
        }
    }
#
Re: Построитель запросов QueryBuilder
Хочу сделать отборку товара по первой букве в названии, объекту магазина приделываю queryBuilder

$Shop_Controller_Show->shopItems()->queryBuilder()
        ->where('UCASE(LEFT(shop_items.name, 1))', '=', $liter);

На выходе получаю ошибку формирования запроса. Эта строка в запросе выглядит так:
UCASE(LEFT(`shop_items`.`name, 1`)) = 'Г'

Из этого отрывка видно что билдет неправильно расставил косые кавычки, правильно будет так:
UCASE(LEFT(`shop_items`.`name`, 1)) = 'Г'
В этом случае запрос выполняется правильно.
Как заставить билдер правильно расставить косые кавычки?
Версия 6.0.4 корпорация.
Весь запрос для справки

SELECT SQL_CALC_FOUND_ROWS `shop_items`.* FROM `shop_items` WHERE `shop_items`.`shop_id` = '3' AND `shop_items`.`active` = 1 AND ( `shop_items`.`start_datetime` < '2012-11-10 13:18:23' OR `shop_items`.`start_datetime` = '0000-00-00 00:00:00' ) AND ( `shop_items`.`end_datetime` > '2012-11-10 13:18:23' OR `shop_items`.`end_datetime` = '0000-00-00 00:00:00' ) AND `shop_items`.`siteuser_group_id` IN (0, -1) AND `shop_items`.`modification_id` = 0 AND UCASE(LEFT(`shop_items`.`name, 1`)) = 'Г' AND `shop_items`.`deleted` = 0 ORDER BY `shop_items`.`datetime` ASC


В селекте то-же самое отрабатывает нормально. Рабочий запрос:
$result = Core_QueryBuilder::select('UCASE(LEFT(`name`, 1)) as alpha')
                ->distinct()
                ->from('shop_items')
                ->where('active', '=', 1)
                ->where('deleted', '=', 0)
                ->where('shop_id', '=', (int)$shop)
                ->execute()
                ->asAssoc()
                ->result();
Модератор
#
Re: Построитель запросов QueryBuilder
Arkadiy,
1. В select AS написан неправильно, нужно
::select(array('UCASE(LEFT(`name`, 1))', 'alpha'))

2. Используйте Core_QueryBuilder::expression
$Shop_Controller_Show->shopItems()->queryBuilder()
        ->where(Core_QueryBuilder::expression('UCASE(LEFT(`shop_items`.`name`, 1))'), '=', $liter);
Авторизация