Скалярный подзапрос с помощью QueryBuilder

#
Скалярный подзапрос с помощью QueryBuilder
Есть необходимость сделать такой запрос к базе:


SELECT `id`, `shop_group_id`, `name`, `price`,

(SELECT `value` FROM property_value_ints WHERE property_value_ints.entity_id = `shop_items`.id AND property_value_ints.property_id = 45 LIMIT 1) AS old_price,
(SELECT `value` FROM property_value_ints WHERE property_value_ints.entity_id = `shop_items`.id AND property_value_ints.property_id = 53 LIMIT 1) AS old_price_curr,
(SELECT `value` FROM list_items WHERE list_items.id = old_price_curr AND list_items.list_id = 28 LIMIT 1) AS old_price_curr_val,
(SELECT `exchange_rate` FROM shop_currencies WHERE shop_currencies.code = old_price_curr_val) AS old_price_curr_coef

FROM `shop_items`
ORDER BY old_price DESC


Читал  тут немного не понятно.  Возможно ли написать так?:


$oCore_QueryBuilder_Select = Core_QueryBuilder::select(array('(SELECT `value` FROM property_value_ints WHERE property_value_ints.entity_id = `shop_items`.id AND property_value_ints.property_id = 45 LIMIT 1)', 'old_price'))->from('shop_items');
E-mail: info@syrbek.ru / телега: @syrbek /skype: activexm / syrbek.ru / Поддержка сайтов / г. Москва [HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, Git, SVN, Redmine]
Модератор
#
Re: Скалярный подзапрос с помощью QueryBuilder
Из документации готовый пример:
Скалярный подзапрос

    // SELECT (SELECT MAX(`column2`) FROM `t2`) FROM `t1`
    $oCore_QueryBuilder_Select2 = Core_QueryBuilder::select('MAX(column2)')->from('t2');
    $oCore_QueryBuilder_Select = Core_QueryBuilder::select($oCore_QueryBuilder_Select2)->from('t1');


То, что Вы добавляете первым индексом массива (запрос в скобках) должно быть объектом с этими условиями, в примере выше это $oCore_QueryBuilder_Select2

$oCore_QueryBuilder_Select2 = Core_QueryBuilder::select( ....;
$oCore_QueryBuilder_Select = Core_QueryBuilder::select(array($oCore_QueryBuilder_Select2, 'old_price'))->from('shop_items');
#
Re: Скалярный подзапрос с помощью QueryBuilder
Модератор. Скажите пожалуйста например такое разрешается?
$oCore_QueryBuilder_Select2 = Core_QueryBuilder::select('value')
                    ->where('property_id', '=', 13)
                    ->where('entity_id', '=', Core_QueryBuilder::expression('`shop_items`.`id`'))
                    ->from('property_value_floats')
                    ->limit(1);
$oCore_QueryBuilder_Select3 = Core_QueryBuilder::select('value')
                    ->where('property_id', '=', 14)
                    ->where('entity_id', '=', Core_QueryBuilder::expression('`shop_items`.`id`'))
                    ->from('property_value_ints')
                    ->limit(1);
$Shop_Controller_Show
                    ->shopItems()
                    ->queryBuilder()
                    ->select(array($oCore_QueryBuilder_Select2, 'ling'))
                    ->select(array($oCore_QueryBuilder_Select3, 'veg'))

Но при этом ругается на то что нету в модели shopItems такие как ling, veg как быть в таком случае?
Спасибо.
E-mail: info@syrbek.ru / телега: @syrbek /skype: activexm / syrbek.ru / Поддержка сайтов / г. Москва [HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, Git, SVN, Redmine]
Модератор
#
Re: Скалярный подзапрос с помощью QueryBuilder
Seri,
естественно будет ошибка, т.к. такие поля отсутствуют в таблице и в модели. Если вам нужны какие то доп. данные, выбирайте их внутри хука на getXml()
#
Re: Скалярный подзапрос с помощью QueryBuilder
HostCMS писал(а):
естественно будет ошибка, т.к. такие поля отсутствуют в таблице и в модели. Если вам нужны какие то доп. данные, выбирайте их внутри хука на getXml()

Можете дать пример как это используется?
E-mail: info@syrbek.ru / телега: @syrbek /skype: activexm / syrbek.ru / Поддержка сайтов / г. Москва [HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, Git, SVN, Redmine]
Модератор
#
Re: Скалярный подзапрос с помощью QueryBuilder
http://www.hostcms.ru/documentation/modules/core/events/

Добавление своего тега в XML всех объектов Shop_Item
1. Пишем класс наблюдателя, размещаем его в modules/shop/item/observer.php

class Shop_Item_Observer
{
   static public function onBeforeGetXml($object, $args)
   {
      // Добавить новый тег, равный price * 2
      $object->addXmlTag('myTag', $object->price * 2);
   }
}


2. Добавляем наблюдается в bootstrap.php

// Add shop_item observer
Core_Event::attach('shop_item.onBeforeGetXml', array('Shop_Item_Observer', 'onBeforeGetXml'));
Авторизация