Как выбрать из таблиц magento EAV, когда включены данные по продукту плоского каталога - PullRequest
7 голосов
/ 12 мая 2011

У меня есть этот код для выбора наиболее продаваемых продуктов Magento:

$productCollection = Mage::getResourceModel('reports/product_collection')
            ->addOrderedQty($startTime, $currentTime)
            ->addAttributeToSelect('*')
            ->setStoreId($storeId)
            ->addStoreFilter($storeId)
            ->setOrder('ordered_qty', 'desc')
            ->setPageSize($this->limit());
    }

и все работает нормально, пока я не установлю "использовать плоский каталог товаров" в бэкэнде на yes. Есть ли способ сказать magento не использовать плоские таблицы, а вместо этого использовать EAV?
Может ли кто-нибудь помочь мне с этим.

Ответы [ 6 ]

9 голосов
/ 28 мая 2011

Создайте новый класс модели ('mycatalog/product'), который расширяет исходный класс продукта, но жестко закодирует его для использования модели ресурсов EAV и коллекции ресурсов EAV, а затем используйте эту модель в своем коде запроса.

4 голосов
/ 30 мая 2011

Я запускал свой код из отдельного php-файла, как только я переместил свой код в модуль администратора, он перестал использовать flat_file и вернулся к eav.

Если вы посмотрите на: Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Collection

Есть метод:

public function isEnabledFlat()
{
    if (Mage::app()->getStore()->isAdmin()) {
        return false;
    }
    if (!isset($this->_flatEnabled[$this->getStoreId()])) {
        $this->_flatEnabled[$this->getStoreId()] = $this->getFlatHelper()
            ->isEnabled($this->getStoreId());
    }
    return $this->_flatEnabled[$this->getStoreId()];
}

Вы можете изменить это, чтобы добавить дополнительное условие, которое возвращает false в зависимости от ваших собственных критериев.

Кстати, коллекция отчетов, упомянутая в первом посте Blazo, является продолжением этой коллекции.

2 голосов
/ 14 августа 2016

Я использую

Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);

до

Mage::getModel('catalog/product')->getCollection()

И он начинает получать данные из системы на основе eav.

2 голосов
/ 14 декабря 2013

Чтобы развернуть ответ Алана:

class Namespace_Module_Model_Category extends Mage_Catalog_Model_Category
{
    protected function _construct()
    {
        $this->_init('catalog/category');

    }

}

Приведенное выше снимает проверку, чтобы увидеть, была ли включена квартира, и только вставляет стандартную версию ресурса каталога / категории.

Изатем, когда вы хотите загрузить свою модель, гарантируя, что вы получите модель eav, независимо от того, включены ли плоские данные:

$category = Mage::getModel('namespace_module/category')->load($id)
1 голос
/ 18 марта 2013

Это старый пост, но я думал, что один важный момент не был заявлен.1. После включения плоского каталога необходимо запустить индексатор с помощью cron или admin / shell, чтобы заполнить таблицы плоского каталога.

  1. Если в вашем поиске много товаров, минуя плоский каталогтаблица будет тормозить ваш сайт, и каждый поисковый код будет потреблять много ресурсов.
0 голосов
/ 22 июня 2015

Я обнаружил, что самым простым решением было отключить плоские таблицы и затем получить SQL-запрос, который magento выполняет с помощью параметра -> load (true)

, например

$collection = Mage::getModel('catalog/category')->getCollection();
$collection
    ->setStoreId($store->getId())
    ->addAttributeToSelect('*')
    ->addAttributeToFilter(array(array('attribute'=>'ig_unifeed_ids', 'like'=>"%:".$this->getId().":%")))
    ->load(true);

затем снова включите плоские таблицы и замените этот код на:

$resource = Mage::getSingleton('core/resource');
$readConnection = $resource->getConnection('core_read');
$query = "SELECT `e`.*, `at_ig_unifeed_ids`.`value` AS `ig_unifeed_ids` FROM `catalog_category_entity` AS `e` INNER JOIN `catalog_category_entity_varchar` AS `at_ig_unifeed_ids` ON (`at_ig_unifeed_ids`.`entity_id` = `e`.`entity_id`) AND (`at_ig_unifeed_ids`.`attribute_id` = '139') AND (`at_ig_unifeed_ids`.`store_id` = 0) WHERE (`e`.`entity_type_id` = '3') AND ((at_ig_unifeed_ids.value LIKE '%:".$this->getId().":%'))";
$collection = $readConnection->fetchAll($query);

С этого момента вам, вероятно, потребуется изменить другой код, например, заменить

$ category-> GetId ()

с

$ категории [ "ENTITY_ID"]

Надеюсь, это немного поможет ...

ПРИМЕЧАНИЕ: это реальное решение для ошибки в модуле IG_Unifeed, которая игнорирует фильтрацию категорий при использовании плоских таблиц.

...