Проблема выборки товаров в категории. Из серии "Очень страшный запрос")

Нашли ошибку ? Пишите в этот раздел

Модератор: core team

Vicos
Специалист
Сообщения: 36
Зарегистрирован: Вт сен 27, 2016 7:09 am

Проблема выборки товаров в категории. Из серии "Очень страшный запрос")

Сообщение Vicos » Чт дек 15, 2016 6:03 am

Здравствуйте! Натолкнулся на ещё одну проблему связанную с выборкой товаров в категории.
Проблема раскрывается когда имеется множество категорий и подкатегорий и один товар может принадлежать большому числу этих категорий и подкатегорий)
Запрос примерно выглядит так.

Код: Выделить всё

SELECT `t`.`id` AS `t0_c0`, `t`.`type_id` AS `t0_c1`, `t`.`producer_id` AS `t0_c2`, `t`.`category_id` AS `t0_c3`, `t`.`sku` AS `t0_c4`, `t`.`name` AS `t0_c5`, `t`.`slug` AS `t0_c6`, `t`.`price` AS `t0_c7`, `t`.`discount_price` AS `t0_c8`, `t`.`discount` AS `t0_c9`, `t`.`description` AS `t0_c10`, `t`.`short_description` AS `t0_c11`, `t`.`data` AS `t0_c12`, `t`.`is_special` AS `t0_c13`, `t`.`length` AS `t0_c14`, `t`.`width` AS `t0_c15`, `t`.`height` AS `t0_c16`, `t`.`weight` AS `t0_c17`, `t`.`quantity` AS `t0_c18`, `t`.`in_stock` AS `t0_c19`, `t`.`status` AS `t0_c20`, `t`.`create_time` AS `t0_c21`, `t`.`update_time` AS `t0_c22`, `t`.`meta_title` AS `t0_c23`, `t`.`meta_keywords` AS `t0_c24`, `t`.`meta_description` AS `t0_c25`, `t`.`image` AS `t0_c26`, `t`.`average_price` AS `t0_c27`, `t`.`purchase_price` AS `t0_c28`, `t`.`recommended_price` AS `t0_c29`, `t`.`position` AS `t0_c30`, `t`.`external_id` AS `t0_c31`, `t`.`title` AS `t0_c32`, `t`.`meta_canonical` AS `t0_c33`, `t`.`image_alt` AS `t0_c34`, `t`.`image_title` AS `t0_c35`, `categoryRelation`.`id` AS `t1_c0`, `categoryRelation`.`product_id` AS `t1_c1`, `categoryRelation`.`category_id` AS `t1_c2` FROM `yu2pe_store_product` `t` LEFT OUTER JOIN `yu2pe_store_product_category` `categoryRelation` ON (`categoryRelation`.`product_id`=`t`.`id`) WHERE ((t.status = 1) AND ((categoryRelation.category_id IN ('15', '16', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '30', '31', '32', '33', '34', '35', '36', '37', '42', '38', '39', '40', '41', '43', '44', '45', '46', '47', '48', '49', '50', '51', '52', '53', '54', '55', '56', '57', '58', '59', '1')) OR (t.category_id IN ('15', '16', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '30', '31', '32', '33', '34', '35', '36', '37', '42', '38', '39', '40', '41', '43', '44', '45', '46', '47', '48', '49', '50', '51', '52', '53', '54', '55', '56', '57', '58', '59', '1')))) ORDER BY t.position LIMIT 20

Залечил добавление группировки по id товара в методе:

Код: Выделить всё

/**
     * modules/store/components/repository/Productrepository.php
     * @param StoreCategory $category
     * @param bool $withChild
     * @param null $limit
     * @return CActiveDataProvider
     */
    public function getListForCategory(StoreCategory $category, $withChild = true, $limit = null)
    {
        $categories = [];

        if (true === $withChild) {
            $categories = $category->getChildsArray();
        }

        $categories[] = $category->id;

        $criteria = new CDbCriteria([
            'with' => [
                'categoryRelation' => [
                    'together' => true
                ],
            ],
            'scopes' => ['published'],
        ]);

        $criteria->addInCondition('categoryRelation.category_id', array_unique($categories));
        $criteria->addInCondition('t.category_id', array_unique($categories), 'OR');
/*** Собственно добавил эту строчку ***/
        $criteria->group='t.id';
/*** Конец изменений ***/
        $pagination = [
            'pageSize' => (int)Yii::app()->getModule('store')->itemsPerPage,
            'pageVar' => 'page',
        ];

        if ($limit) {
            $pagination = false;
            $criteria->limit = (int)$limit;
        }

        return new CActiveDataProvider(
            Product::model(),
            [
                'criteria' => $criteria,
                'pagination' => $pagination,
                'sort' => [
                    'sortVar' => 'sort',
                    'defaultOrder' => 't.position',
                ],
            ]
        );
    }

Не знаю возникнет ли проблема на чистой установке yupe, так как товары я импортировал самописным модулем и производил изменения во внешних ключах, но сравнил и вернул как было проблема осталась, возможно чего то и запортачил в базе. Хотя опираясь на предыдущий пост в этой серии допускаю что это упущение в yupe.

Vicos
Специалист
Сообщения: 36
Зарегистрирован: Вт сен 27, 2016 7:09 am

Re: Проблема выборки товаров в категории. Из серии "Очень страшный запрос")

Сообщение Vicos » Чт дек 15, 2016 6:05 am

Проблема не решена при переходе по страницам, а так же при сортировке. Там отваливается группировка.

Vicos
Специалист
Сообщения: 36
Зарегистрирован: Вт сен 27, 2016 7:09 am

Re: Проблема выборки товаров в категории. Из серии "Очень страшный запрос")

Сообщение Vicos » Чт дек 15, 2016 6:14 am

Пофиксил. В том же файле, метод.

Код: Выделить всё

public function getByFilter(array $mainSearchAttributes, array $typeSearchAttributes)
    {
        $criteria = new CDbCriteria([
            'select' => 't.*',
            'distinct' => true,
            'params' => [],
        ]);
        $criteria->addCondition('t.status = :status');
        $criteria->params['status'] = Product::STATUS_ACTIVE;

        //поиск по категории, производителю и цене
        foreach ($this->attributeFilter->getMainSearchParams() as $param => $field) {

            if (empty($mainSearchAttributes[$param])) {
                continue;
            }

            if ('category' === $param) {

                $categories = [];

                foreach ($mainSearchAttributes[$param] as $categoryId) {
                    $categories[] = $categoryId;
                    $categories = CMap::mergeArray($categories, StoreCategory::model()->getChildsArray($categoryId));
                }

                $criteria->with = [
                    'categoryRelation' => [
                        'together' => true
                    ]
                ];
                $criteria->addInCondition('categoryRelation.category_id', array_unique($categories));
                $criteria->addInCondition('t.category_id', array_unique($categories), 'OR');
                continue;
            }

            if (isset($mainSearchAttributes[$param]['from'], $mainSearchAttributes[$param]['to'])) {
                $criteria->addBetweenCondition(
                    "t.".$field,
                    $mainSearchAttributes[$param]['from'],
                    $mainSearchAttributes[$param]['to']
                );
            } elseif (isset($mainSearchAttributes[$param]['from']) && !isset($mainSearchAttributes[$param]['to'])) {
                $criteria->addCondition("t.{$field} >= :attr_{$field}");
                $criteria->params[":attr_{$field}"] = $mainSearchAttributes[$param]['from'];
            } elseif (isset($mainSearchAttributes[$param]['to']) && !isset($mainSearchAttributes[$param]['from'])) {
                $criteria->addCondition("t.{$field} <= :attr_{$field}");
                $criteria->params[":attr_{$field}"] = $mainSearchAttributes[$param]['to'];
            } else {
                $criteria->addInCondition("t.".$field, $mainSearchAttributes[$param]);
            }
        }

        //поиск по названию и артикулу
        if (!empty($mainSearchAttributes[AttributeFilter::MAIN_SEARCH_PARAM_NAME])) {
            $criteria->addSearchCondition('name', $mainSearchAttributes[AttributeFilter::MAIN_SEARCH_PARAM_NAME], true);
            $criteria->addSearchCondition('sku', $mainSearchAttributes[AttributeFilter::MAIN_SEARCH_PARAM_NAME], true,
                'OR');
        }

        $criteria->mergeWith($this->buildCriteriaForTypeAttributes($typeSearchAttributes));

/******* тут. */
        $criteria->group='t.id';
/*******/

        return new CActiveDataProvider(
            'Product',
            [
                'criteria' => $criteria,
                'pagination' => [
                    'pageSize' => (int)Yii::app()->getModule('store')->itemsPerPage,
                    'pageVar' => 'page',
                ],
                'sort' => [
                    'sortVar' => 'sort',
                    'defaultOrder' => 't.position',
                ],
            ]
        );
    }

Аватара пользователя
xoma
Администратор
Сообщения: 1971
Зарегистрирован: Ср авг 22, 2012 8:54 am
Контактная информация:

Re: Проблема выборки товаров в категории. Из серии "Очень страшный запрос")

Сообщение xoma » Чт дек 15, 2016 8:53 am

Так а в чем изначально проблема? Почему решили изменить метод?
отследить-посылку.рф - дружит с "Юпи!", следит за посылками!

Vicos
Специалист
Сообщения: 36
Зарегистрирован: Вт сен 27, 2016 7:09 am

Re: Проблема выборки товаров в категории. Из серии "Очень страшный запрос")

Сообщение Vicos » Пт дек 16, 2016 8:54 am

xoma писал(а):Так а в чем изначально проблема? Почему решили изменить метод?

Ах да)
Получалось что выбирался один товар для каждой категории и подкатегории к которой он принадлежит.
В результате на странице у нас был один товар при лимите 20, т.е. товар принадлежал 20 и более категориям.
Для подкатегорий всё нормально так как небыло боьшого количества категорий для выборки.
У вас нет необходимых прав для просмотра вложений в этом сообщении.

Аватара пользователя
xoma
Администратор
Сообщения: 1971
Зарегистрирован: Ср авг 22, 2012 8:54 am
Контактная информация:

Re: Проблема выборки товаров в категории. Из серии "Очень страшный запрос")

Сообщение xoma » Пт дек 16, 2016 10:17 am

Vicos писал(а):
xoma писал(а):Так а в чем изначально проблема? Почему решили изменить метод?

Ах да)
Получалось что выбирался один товар для каждой категории и подкатегории к которой он принадлежит.
В результате на странице у нас был один товар при лимите 20, т.е. товар принадлежал 20 и более категориям.
Для подкатегорий всё нормально так как небыло боьшого количества категорий для выборки.



Это у вас на какой версии? Помнится мы это уже исправляли.
отследить-посылку.рф - дружит с "Юпи!", следит за посылками!

Vicos
Специалист
Сообщения: 36
Зарегистрирован: Вт сен 27, 2016 7:09 am

Re: Проблема выборки товаров в категории. Из серии "Очень страшный запрос")

Сообщение Vicos » Пт дек 16, 2016 10:38 am

1.0 beta2, вроде такая. 13 сентября скачивал.
Ну раз пофиксили это, тогда ладно.

Аватара пользователя
xoma
Администратор
Сообщения: 1971
Зарегистрирован: Ср авг 22, 2012 8:54 am
Контактная информация:

Re: Проблема выборки товаров в категории. Из серии "Очень страшный запрос")

Сообщение xoma » Пт дек 16, 2016 11:34 am

Vicos писал(а):1.0 beta2, вроде такая. 13 сентября скачивал.
Ну раз пофиксили это, тогда ладно.


В 1.0 уже пофиксили, скоро 1.1 выпустим. Обновитесь =)
отследить-посылку.рф - дружит с "Юпи!", следит за посылками!

Vicos
Специалист
Сообщения: 36
Зарегистрирован: Вт сен 27, 2016 7:09 am

Re: Проблема выборки товаров в категории. Из серии "Очень страшный запрос")

Сообщение Vicos » Пн дек 19, 2016 12:15 pm

xoma писал(а):
Vicos писал(а):1.0 beta2, вроде такая. 13 сентября скачивал.
Ну раз пофиксили это, тогда ладно.


В 1.0 уже пофиксили, скоро 1.1 выпустим. Обновитесь =)

Спасибо! Но обновиться мне уже нельзя, что-то я не верно начал)

Аватара пользователя
xoma
Администратор
Сообщения: 1971
Зарегистрирован: Ср авг 22, 2012 8:54 am
Контактная информация:

Re: Проблема выборки товаров в категории. Из серии "Очень страшный запрос")

Сообщение xoma » Пн дек 19, 2016 1:04 pm

Vicos писал(а):
xoma писал(а):
Vicos писал(а):1.0 beta2, вроде такая. 13 сентября скачивал.
Ну раз пофиксили это, тогда ладно.


В 1.0 уже пофиксили, скоро 1.1 выпустим. Обновитесь =)

Спасибо! Но обновиться мне уже нельзя, что-то я не верно начал)


Многое переписали?
отследить-посылку.рф - дружит с "Юпи!", следит за посылками!

Vicos
Специалист
Сообщения: 36
Зарегистрирован: Вт сен 27, 2016 7:09 am

Re: Проблема выборки товаров в категории. Из серии "Очень страшный запрос")

Сообщение Vicos » Пн дек 19, 2016 1:42 pm

Нет, но даже и то что не трогал всё равно сыпится, восстанавливать возможность обновления не стал, хотя очень хочется( Пока продолжу так. Доделать не много осталось. В следующий раз если буду начинать, то буду уже внимательнее к этим моментам.

Аватара пользователя
xoma
Администратор
Сообщения: 1971
Зарегистрирован: Ср авг 22, 2012 8:54 am
Контактная информация:

Re: Проблема выборки товаров в категории. Из серии "Очень страшный запрос")

Сообщение xoma » Пн дек 19, 2016 2:14 pm

Vicos писал(а):Нет, но даже и то что не трогал всё равно сыпится, восстанавливать возможность обновления не стал, хотя очень хочется( Пока продолжу так. Доделать не много осталось. В следующий раз если буду начинать, то буду уже внимательнее к этим моментам.


Ну если "сыпится" что-то из стандартного функционала - пишите, будем править.
отследить-посылку.рф - дружит с "Юпи!", следит за посылками!


Вернуться в «Сообщения об ошибках»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя