Получаю ошибку, но не уверен, что это такое
Я пишу пользовательскую функцию, которая позволяет мне продавать товары из корзины.
Я написал эту функцию следующим образом:
$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 не дает мне конкретной причины ошибки.
4 answers
Похоже, что ваше сообщение об ошибке может быть причиной addIdFilter
Вы можете попробовать
Передача строки с идентификаторами, разделенными запятыми:
->addIdFilter("46, 56, 60") // instead of IN('46', '56', '60', )) extra comma :(
Если это не сработает, вы всегда можете попробовать:
->addAttributeToFilter('entity_id', array('in' => array(46, 56, 60)))
Надеюсь, это сработает для вас.
WHERE (e.entity_id IN('46', '56', '60', ))
там есть запятая в конце.
Когда вы вызываете $productIds[] = $product->getCrossSellProductIds()
в цикле, вы получаете массив, который, вероятно, выглядит примерно так
$productIds = array(array('46', '56', '60'), array())
Я не хочу спускаться в кроличью нору того, что происходит после вызова addIdFilter
, но я бы предположил, что он не ожидает массив массивов с пустыми массивами, следовательно, плохое поколение sql.
На вашем месте я бы проверил, как выглядит $productIds, прежде чем добавлять его в коллекцию, и если он это не плоская коллекция идентификаторов продуктов, я бы расплющил ее так, как это было, и посмотрел, исправило ли это.
Вы должны убедиться, что определяете $productscollection вне оператора if, поэтому, если ваш продукт не связан с перекрестными продажами, вы вернете неопределенный var.
Выглядит странно, что применен двойной фильтр "store" и "StoreID" с помощью addStoreFilter().
Я предлагаю получать идентификаторы перекрестных продаж непосредственно из базы данных, чтобы повысить производительность, вы можете получить все эти идентификаторы с помощью упрощенного запроса, избегая повторной загрузки каждого продукта в предложении. Окончательно, не является атрибутом "id" для фильтрации, вместо этого следует использовать "entity_id".
Хорошо, я принял ответ лияката, однако он не полный. Поэтому я также добавил ответ здесь.
Посмотрев на все приведенные ответы, @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;
Надеюсь, что это поможет другим в будущем.