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

#
Re: Построитель запросов QueryBuilder
Оу! Как же я ошибался... SQL-запрос на самом деле совсем не успешный. Он выполнялся частично. Затык у него был в самом конце. А я видел, что значения обновляются, думал, что всё ok.

В общем так, проблема, судя по всему происходит в этой части запроса:

$update = Core_QueryBuilder::update('my_pay_free_visits')
   ->columns(array('time' => 'NOW()'))
   ...


NOW() воспринимается как строка и, конечно же, MySQL немного в шоке от того, что в поле метки времени пытаются подставить строку.
А что мне нужно вместо 'NOW()' использовать?
Это?
'time' => Core_QueryBuilder::expression('NOW()')

Или это?

'time' => Core_QueryBuilder::expression()->expression('NOW()')
Модератор
#
Re: Построитель запросов QueryBuilder
lezhenkin,
Нашлась ошибка, в файле modules\core\querybuilder\update.php укажите
protected $_queryType = 2;
вместо
protected $_queryType = 8;
изменение войдет в 6.1.3

lezhenkin писал(а):
Но возвращается-таки объект Core_DataBase_Mysql, в котором метод getAffectedRows() и объявлен как общедоступный.

Я имел ввиду несколько другое, если у Вас будет драйвер PDO, то возвращать будет совсем другой класс, тоже унаследованный от абстрактного Core_DataBase.
Модератор
#
Re: Построитель запросов QueryBuilder
lezhenkin,
Первый вариант использования
Core_QueryBuilder::expression('NOW()')
предпочтительнее
#
Re: Построитель запросов QueryBuilder
Цитата:
изменение войдет в 6.1.3

У меня в этом файле было так:
/**
* DataBase Query Type
* 7 - UPDATE
*/
protected $_queryType = 7;

Исправил на 2.
Цитата:
Первый вариант использования

Этот вариант вызывает исключение.
Exception: Wrong argument type (expected String) for quote()
35 modules/core/exception.php
428 modules/core/database.php
182 modules/core/querybuilder/update.php
210 modules/core/querybuilder/update.php
54 modules/core/querybuilder/statement.php
142 hostcmsfiles/structure/Structure106.php
628 modules/structure/model.php
137 modules/core/page.php
40 templates/template19/template.htm
86 modules/template/model.php
137 modules/core/page.php
222 templates/template13/template.htm
86 modules/template/model.php
137 modules/core/page.php
375 modules/core/command/controller/default.php
190 modules/core/router/route.php
205 index.php
Модератор
#
Re: Построитель запросов QueryBuilder
lezhenkin,
там на 2 нужно было исправить, посмотрите, пожалуйста, сообщение. А по поводу ошибки судя по всему не предполагаем мы там использование expression, обратитесь в поддержку со ссылкой на эту страницу и данными доступа по ФТП, попробуем разместить обновленные файлы.
#
Re: Построитель запросов QueryBuilder
Цитата:
там на 2 нужно было исправить, посмотрите, пожалуйста, сообщение

Да-да, исправил на 2
Цитата:
обратитесь в поддержку со ссылкой на эту страницу и данными доступа по ФТП

Хорошо. Благодарю.
#
Re: Построитель запросов QueryBuilder
Добрый день.
Вопрос по QueryBuilder`у.
Вношу изменения в ТДС Интернет-магазин.

  $Shop_Controller_Show->shopItems()
          ->queryBuilder()
          ->join(array($oCore_QueryBuilder_Select2, 'flt'), 'shop_items.marking', '=', 'flt.Search');

где $oCore_QueryBuilder_Select2 - есть некая выборка из двух колонок с которой мы затем сравниваем наши товары, и где совпал Артикул - те выводим.

Проблема в том, что мне нужно вместе с полями таблицы shop_items вывести эти вот вышеупомянутые 2 поля из таблицы с которой сравниваем. Для этого мне нужно, чтобы в /modules/shop/controller/show.php

вместо

      $this->_Shop_Items
         ->queryBuilder()
         ->select('shop_items.*')
              ->where('shop_items.active', '=', 1)
         ->open()
         ->where('shop_items.start_datetime', '<', $dateTime)
         ->setOr()
         ->where('shop_items.start_datetime', '=', '0000-00-00 00:00:00')
         ->close()
         ->setAnd()
         ->open()
         ->where('shop_items.end_datetime', '>', $dateTime)
         ->setOr()
         ->where('shop_items.end_datetime', '=', '0000-00-00 00:00:00')
         ->close()
         ->where('shop_items.siteuser_group_id', 'IN', $this->_aSiteuserGroups)
         //->where('shop_items.modification_id', '=', 0)
         ;


было

      $this->_Shop_Items
         ->queryBuilder()
         ->select('*')
              ->where('shop_items.active', '=', 1)
         ->open()
         ->where('shop_items.start_datetime', '<', $dateTime)
         ->setOr()
         ->where('shop_items.start_datetime', '=', '0000-00-00 00:00:00')
         ->close()
         ->setAnd()
         ->open()
         ->where('shop_items.end_datetime', '>', $dateTime)
         ->setOr()
         ->where('shop_items.end_datetime', '=', '0000-00-00 00:00:00')
         ->close()
         ->where('shop_items.siteuser_group_id', 'IN', $this->_aSiteuserGroups)
         //->where('shop_items.modification_id', '=', 0)
         ;


это, насколько я понимаю работало бы и с НЕ измененной ТДС.
Но на          ->select('*' - HostCMS ругается "Exception: Could not execute Shop_Item_Model::__construct()".

Как можно послать запрос на вывод ВСЕХ получившихся в результате запроса столбцов, т.е. *? И можно ли обойтись без изменения контроллера, а только лишь в ТДС внеся правки?
Модератор
#
Re: Построитель запросов QueryBuilder
Ответ дан в поддержку, этого вам не должно хотеться. В модели не могут быть записаны поля из другой таблицы, которые отсутствуют в таблице, представлением которой является модель.
#
Re: Построитель запросов QueryBuilder
подскажите, в чем ошибка в этом запросе:

$oInformationsystem = Core_Entity::factory('Informationsystem', 17);
$oInformationsystem_Items = $oInformationsystem->Informationsystem_Items;
$oInformationsystem_Items->queryBuilder()->where('informationsystem_items.active', '=', 1);

$oInformationsystem_Items
         ->queryBuilder()
         ->leftJoin('informationsystem_item_properties', 'informationsystem_items.informationsystem_id', '=', 'informationsystem_item_properties.informationsystem_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', '=', 249)
         ->where('property_value_ints.value', '=', '227')
         ->groupBy('informationsystem_items.id')
         ->having(Core_Querybuilder::expression('COUNT(DISTINCT `informationsystem_item_properties`.`property_id`)'), '=', 1)
         ;

$Informationsystem_Item = $oInformationsystem_Items->getByGroupId(0);


если есть элементы, удовлетворяющие ('property_value_ints.value', '=', '227' - выдает ошибку "Exception: Could not execute Informationsystem_Item_Model::__construct() "
если элементов нет - ошибка не выдается

задача - получить в php элементы с определенным значением доп. свойства
Модератор
#
Re: Построитель запросов QueryBuilder
inteo,
сравните условия с типовым примером фильтрации по доп. св-вам в соседней темы про контроллеры, если все верно, временно попробуйте заменить getByGroupId(0) на findAll(). Проверьте, чтобы HostCMS была последней версии.
Авторизация