Получаю ошибку, но не уверен, что это такое


Я пишу пользовательскую функцию, которая позволяет мне продавать товары из корзины.

Я написал эту функцию следующим образом:

        $quote = $this->getQuote();
        $quoteItems = $quote->getAllItems();

        $productIds = array();
        foreach($quoteItems as $item){
            if (!$item->getParentItem()) {
                $product = Mage::getModel('catalog/product')->load($item->getProductId());
                $productIds[] = $product->getCrossSellProductIds();

            }
        }
        if ($productIds) {
            $productCollection = Mage::getModel('catalog/product')
                ->getCollection()
                ->setStoreId($this->getQuote()->getStoreId())
                ->addStoreFilter($this->getQuote()->getStoreId())
                ->addAttributeToSelect('name')
                ->addAttributeToSelect('price')
                ->addAttributeToSelect('small_image')
                ->addIdFilter($productIds)
                ->load();
        }
    }
    return $productCollection;

Но это дает мне ошибку только для некоторых продуктов. Не уверен, что происходит.

Как я понимаю, он пытается отфильтровать продукты из store.

Ошибка

A:5:{i:0; s:238: "ВЫБЕРИТЕ e.*ИЗ catalog_product_entity КАК e ВНУТРЕННЕЕ СОЕДИНЕНИЕ catalog_product_website КАК product_website НА product_website.product_id = e.идентификатор сущности И сайт product_website.website_id = '1', ГДЕ (e.entity_id В('46', '56', '60', ))

Может ли кто-нибудь указать мне, что происходит, поскольку magento не дает мне конкретной причины ошибки.

Author: Adarsh Khatri, 2015-08-04

4 answers

Похоже, что ваше сообщение об ошибке может быть причиной addIdFilter

Вы можете попробовать

Передача строки с идентификаторами, разделенными запятыми:

->addIdFilter("46, 56, 60") // instead of IN('46', '56', '60', )) extra comma :(

Если это не сработает, вы всегда можете попробовать:

->addAttributeToFilter('entity_id', array('in' => array(46, 56, 60))) 

Надеюсь, это сработает для вас.

 2
Author: liyakat, 2015-08-04 23:12:28

WHERE (e.entity_id IN('46', '56', '60', )) там есть запятая в конце.

Когда вы вызываете $productIds[] = $product->getCrossSellProductIds() в цикле, вы получаете массив, который, вероятно, выглядит примерно так

$productIds = array(array('46', '56', '60'), array())

Я не хочу спускаться в кроличью нору того, что происходит после вызова addIdFilter, но я бы предположил, что он не ожидает массив массивов с пустыми массивами, следовательно, плохое поколение sql.

На вашем месте я бы проверил, как выглядит $productIds, прежде чем добавлять его в коллекцию, и если он это не плоская коллекция идентификаторов продуктов, я бы расплющил ее так, как это было, и посмотрел, исправило ли это.

 2
Author: Richard, 2015-08-04 11:27:50

Вы должны убедиться, что определяете $productscollection вне оператора if, поэтому, если ваш продукт не связан с перекрестными продажами, вы вернете неопределенный var.

Выглядит странно, что применен двойной фильтр "store" и "StoreID" с помощью addStoreFilter().

Я предлагаю получать идентификаторы перекрестных продаж непосредственно из базы данных, чтобы повысить производительность, вы можете получить все эти идентификаторы с помощью упрощенного запроса, избегая повторной загрузки каждого продукта в предложении. Окончательно, не является атрибутом "id" для фильтрации, вместо этого следует использовать "entity_id".

 1
Author: MauroNigrele, 2015-08-04 04:28:15

Хорошо, я принял ответ лияката, однако он не полный. Поэтому я также добавил ответ здесь.

Посмотрев на все приведенные ответы, @liyakat указал мне правильное направление, но не дал мне решения, так как я не выполняю там пользовательский запрос.

Вот мой ответ:

    $quote = $this->getQuote();
    $quoteItems = $quote->getAllItems();

    $productIds = array();
    foreach($quoteItems as $item){
        if (!$item->getParentItem()) {
            $product = Mage::getModel('catalog/product')->load($item->getProductId());
            //putting to if condition so if there is no cross sell for the item then it will not load up.
            // and this will remove that empty node at the end.
            if(count($product->getCrossSellProductIds()) > 0){ 
                $productIds[] = $product->getCrossSellProductIds();
            }

        }
    }
    if ($productIds) {
        $productCollection = Mage::getModel('catalog/product')
            ->getCollection()
            ->setStoreId($this->getQuote()->getStoreId())
            ->addStoreFilter($this->getQuote()->getStoreId())
            ->addAttributeToSelect('name')
            ->addAttributeToSelect('price')
            ->addAttributeToSelect('small_image')
            ->addIdFilter($productIds)
            ->load();
    }
}
return $productCollection;

Надеюсь, что это поможет другим в будущем.

 1
Author: Adarsh Khatri, 2015-08-05 07:19:50