Хуки и снижение количества запросов

#
Хуки и снижение количества запросов
Подскажите, реально ли использовать хуки для снижения кол-ва запросов к базе?
Проблема такая - при включении modifications(TRUE) кол-во запросов в магазине возрастает с 180 до 1600
в вызове Shop_Controller_Show все что можно обрезано

возможно ли с помощью хуков добавлять условия на вывод модификаций? например, чтобы в xml попадали только модификации с ценой больше 0 и количеством на складе больше 0

и вообще, какие есть варианты тонкой настройки количества запросов? что еще возможно обрезать?)

Модератор
#
Re: Хуки и снижение количества запросов
inteo писал(а):
кол-во запросов в магазине возрастает с 180 до 1600

Запрос на выбор модификаций один. Т.е. независимо от ограничений на количество и цену он всегда будет один. Вам нужно включить показ запросов в клиентской части и посмотреть, что за запросы генерируются.
Вы только что начали читать предложение, чтение которого вы уже заканчиваете.
#
Re: Хуки и снижение количества запросов
к каждой модификации клеится набор запросов
при большом кол-ве модификаций получается очень существенное количество
SELECT * FROM `shop_warehouse_items` WHERE `shop_warehouse_items`.`shop_item_id` = '5743'
SELECT * FROM `shop_specialprices` WHERE `shop_specialprices`.`shop_item_id` = '5743'
SELECT * FROM `shop_item_discounts` WHERE `shop_item_discounts`.`shop_item_id` = '5743'
SELECT `comments`.* FROM `comments` INNER JOIN `comment_shop_items` ON `comments`.`id` = `comment_shop_items`.`comment_id` WHERE `comment_shop_items`.`shop_item_id` = '5743' AND `active` = 1 AND `comments`.`deleted` = 0 ORDER BY `datetime` DESC
SELECT `property_value_ints`.* FROM `property_value_ints` WHERE `entity_id` = '5743' AND `property_id` IN (11) ORDER BY `property_value_ints`.`id` ASC


вопросы
возможно ли отключить вывод комментариев,скидок,спеццен для модификаций, но оставить для основного товара?
возможно ли наложить ограничение на вывод модификаций, чтобы выводились только те, у которых кол-во на складе больше 0, и цена больше 0 (запрос понимаю что один, но тем самым отрежутся все подзапросы для ненужных модификаций)

запросы
SELECT * FROM `shop_specialprices`
SELECT * FROM `shop_item_discounts`
как я понимаю используются для расчета цены, их не отключить, но может как то вообще изменить механизм, выбирать массивы спеццен и скидок одним запросом сразу для всех модификаций одного товара, и использовать данные этого массива...тяжеловато для хостинга дается modifications(TRUE)
Модератор
#
Re: Хуки и снижение количества запросов
inteo,
В общем запросы крайне простые и идут по индексам, любой нормальный хостинг отработает это без проблем, тем более реально вы выбираете на страницу очень много товаров и для них все сопутствующее надо рассчитать.
Теперь о хуках, здесь есть несколько вариантов (говорим для версии 6.1.0)
1. Можно ограничить выбираемые модификации, см. событие shop_item_mode.onBeforeShowXmlModifications, аргументом передается настроенная связь $oShop_Items_Modifications, которую через queryBuilder() можно еще ограничить.
2. shop_item_mode.onBeforeAddModification, аргументом передается сам $oShop_Items_Modification, где Вы можете переопределить все параметры выборки доп. связей (доступно с версии 6.1.1, запросить файл Shop_Item_Model можно в поддержке)

Если что не получится - пишите.
Модератор
#
Re: Хуки и снижение количества запросов
inteo,
а причем тут $object?! см. мой предыдущий ответ, первый аргумент это $args[0]:
$args[0]->queryBuilder()->where('shop_items.price', '>', 0);
#
Re: Хуки и снижение количества запросов
да, уже понял)
#
Re: Хуки и снижение количества запросов
не получается ограничить по количеству на складе
static public function onBeforeShowXmlModifications($object, $args)
   {
        $args[0]->queryBuilder()
        ->leftJoin('shop_warehouse_items', 'shop_warehouse_items.shop_item_id', '=', 'shop_items.id')
        ->having('SUM(shop_warehouse_items.count)', '>', 0);
   }


возвращает Exception: The property 'shop_warehouse_id' does not exist in the model 'shop_item'
Модератор
#
Re: Хуки и снижение количества запросов
inteo,
конечно, Вы объединяете с другой таблицей, и весь результат идет в модель, а в ней нет таких свойств. Ограничьте выборку:
static public function onBeforeShowXmlModifications($object, $args)
   {
        $args[0]->queryBuilder()
        ->select('shop_items.*')
        ->leftJoin('shop_warehouse_items', 'shop_warehouse_items.shop_item_id', '=', 'shop_items.id')
        ->groupBy('shop_items.id')
        ->having(Core_QueryBuilder::expression('SUM(shop_warehouse_items.count)'), '>', 0);
   }
#
Re: Хуки и снижение количества запросов
спасибо, все понятно
но теперь у каждого товара выбирается только одна, видимо первая попавшаяся модификация с ненулевым количеством) странно
Модератор
#
Re: Хуки и снижение количества запросов
Группировку забыли, добавил в код.
Авторизация