Magento: неверное имя атрибута - PullRequest
0 голосов
/ 30 марта 2012

Я пытаюсь получить все продукты, хранящиеся в определенной категории.

Все работает нормально, написание:

$category = Mage::getModel('catalog/category')->load($categoryId);

$products = Mage::getModel('catalog/product')
                ->getCollection()
                ->addCategoryFilter($category)
                ->setOrder('position', 'DESC')
                ->load();

У меня все продукты правильно отсортированы по ихАтрибут позиции.
Так как некоторые из них не имеют установленной позиции, я хочу исключить их, поэтому я попытался просто:

$category = Mage::getModel('catalog/category')->load($categoryId);

$products = Mage::getModel('catalog/product')
                ->getCollection()
                ->addCategoryFilter($category)
                ->addFieldToFilter( 'position', array('gt'=>0) )
                ->setOrder('position', 'DESC')
                ->load();

Но страница не может быть загружена, я получаюошибка «Произошла ошибка при обработке вашего запроса» и журнал ошибок сохраняется в var / report, начиная с

a: 5: {i: 0; s: 33: «Неверное имя атрибута:позиция.

И я не могу решить, чтобы решить эту проблему .. Я много гуглил и пробовал много решений, но никто не работал.
Я не могу понять, почему он принимает атрибут для сортировкипока не для фильтрации.
Есть идеи?

РЕДАКТИРОВАНИЕ:
Запрос, выполняемый $ products

SELECT
    `e`.*,
    `cat_index`.`position` AS `cat_index_position`,
    `price_index`.`price`,
    `price_index`.`tax_class_id`,
    `price_index`.`final_price`,
    IF(`price_index`.`tier_price`, LEAST(`price_index`.`min_price`, `price_index`.`tier_price`),
    `price_index`.`min_price`) AS `minimal_price`,
    `price_index`.`min_price`,
    `price_index`.`max_price`,
    `price_index`.`tier_price`

FROM
    `tb_catalog_product_entity` AS `e`

INNER JOIN
    `tb_catalog_category_product_index` AS `cat_index`
ON
    cat_index.product_id=e.entity_id
AND
    cat_index.store_id='3'
AND
    cat_index.category_id='2476'
AND
    cat_index.is_parent=1

INNER JOIN
    `tb_catalog_product_index_price` AS `price_index`
ON
    price_index.entity_id = e.entity_id
AND
    price_index.website_id = '1'
AND
    price_index.customer_group_id = 0

ORDER BY
    `cat_index_position` ASC,
    `cat_index`.`product_id` ASC


Я также пытался:

$category = Mage::getModel('catalog/category')->load($categoryId);

$products = Mage::getModel('catalog/product')
            ->getCollection()
            ->addCategoryFilter($category)
            ->addFieldToFilter( 'cat_index_position', 'notnull' )
            ->setOrder('position', 'ASC')
            ->load();

с тем же результатом:

Invalid attribute name: cat_index_position.";i:1;s:4700:"#0 /path/app/code/core/Mage/Eav/Model/Entity/Collection/Abstract.php(1155): Mage::exception('Mage_Eav', 'Invalid attribu...')



РЕДАКТИРОВАНИЕ:
Я думаю, что моя проблемапохож на этот , но я не могу понять, как его решить!



РЕДАКТИРОВАНИЕ:

Пробовал также

$category = Mage::getModel('catalog/category')->load($categoryId);

$products = Mage::getModel('catalog/product')
            ->getCollection()
            ->addAttributeToSelect('cat_index_position')
            ->addAttributeToFilter('cat_index_position', array('gt'=>'0'));

Всегда одна и та же ошибка



РЕДАКТИРОВАНИЕ:

Если я добавлю

WHERE `position` > 0

В моем браузере запросов это работает!
Так как мне добавить его в свой запрос в magento?

Ответы [ 3 ]

1 голос
/ 23 февраля 2015

У меня была похожая проблема, и я решил добавить:

$products->getSelect()
            ->joinLeft( array('category_product_index'=>Mage::getResourceModel('catalog/product_collection')->getTable('catalog/category_product_index')), '`e`.`entity_id` = `category_product_index`.`product_id`', array('position AS cat_index_position'))
            ->group('e.entity_id');
1 голос
/ 30 марта 2012

Вы должны использовать

->addFieldToFilter( 'position', 'notnull' )

Для получения дополнительной информации, посмотрите там

0 голосов
/ 05 апреля 2012

Пока я решил таким образом:
1) Изменено
Приложение / код / ​​ядро ​​/ Mage / Eav / модель / Entity / Abstract.php

~line 384
if (empty($attributeInstance)
|| !($attributeInstance instanceof Mage_Eav_Model_Entity_Attribute_Abstract)
|| (!$attributeInstance->getId() && !in_array($attributeInstance->getAttributeCode(), $this->getDefaultAttributes()))
) {
    return false;
}

до

if (empty($attributeInstance)
|| !($attributeInstance instanceof Mage_Eav_Model_Entity_Attribute_Abstract)
// || (!$attributeInstance->getId() && !in_array($attributeInstance->getAttributeCode(), $this->getDefaultAttributes()))
) {
    return false;
}


2) Изменено
Приложение / код / ​​ядро ​​/ Mage / Eav / модель / Entity / Коллекция / Abstract.php

~line 1237
if ($entity->isAttributeStatic($attribute)) {
    $conditionSql = $this->_getConditionSql('e.'.$attribute, $condition);
} else {
....

до

if ($entity->isAttributeStatic($attribute)) {
    $conditionSql = $this->_getConditionSql('e.'.$attribute, $condition);

    $attributeInstance = Mage::getSingleton('eav/config')
                            ->getAttribute($this->getAttribute($attribute)->getEntityType(), $attribute);

    if (!$attributeInstance->getId() && !in_array($attributeInstance->getAttributeCode(), $this->getAttribute($attribute)->getDefaultAttributes()))
    {
        // die( "FOUND".$attribute );
        $conditionSql = $this->_getConditionSql($attribute, $condition);
    }

} else {
...



И наконец Я могу отфильтровать свою коллекцию по позиции:

$category = Mage::getModel('catalog/category')->load($categoryId);

$products = Mage::getModel('catalog/product')
            ->getCollection()
            ->addCategoryFilter($category)
            ->addAttributeToFilter('position', array('gt'=>'0'))
            ->setOrder('position', 'ASC')
            ->load();



Примечание:
Очевидно, что лучше переопределить предыдущие основные файлы, чем изменять их напрямую.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...