Присоединение к модели ресурса, у которой нет выбора?

magento.stackexchange https://magento.stackexchange.com/questions/1536

  •  16-10-2019
  •  | 
  •  

Вопрос

Итак, у меня есть эта модель ресурса, которую я вытащил из некоторого кода администратора на панели инструментов. Это работает, но я не могу присоединиться к этому. Делает ->getSelect()->__toString(); ничего не показывает? Так разве это не нормальная коллекция? Почему это не работает, как другие коллекции?

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

$storeId = $this->helper('core')->getStoreId();
$collection = Mage::getResourceModel('sales/report_bestsellers_collection')
    ->setModel('catalog/product')
    ->addStoreFilter($storeId);

$collection->getSelect()->join(
        array('category_product' => 'catalog_category_product'),
        'main_table.product_id = category_product.product_id', 
        array('category_product.*')
    )->where('category_product.category_id = ?', '3')
     ->order('main_table.qty_ordered DESC')
     ->limit($limit);
Это было полезно?

Решение

Отчетные коллекции работают немного по -другому, что Mage_Core_Model_Abstract/Crud Collections. Коллекции CRUD будут иметь SQL -запрос, назначенный немедленно на экземпляре. Однако коллекция отчетов инициализирует свой оператор SQL во время операции нагрузки. Вы можете увидеть это в load Метод внизу в абстрактном базовом классе для всех коллекций отчетности.

#File: app/code/core/Mage/Reports/Model/Resource/Report/Collection/Abstract.php
public function load($printQuery = false, $logQuery = false)
{
    if ($this->isLoaded()) {
        return $this;
    }
    $this->_initSelect();
    if ($this->_applyFilters) {
        $this->_applyDateRangeFilter();
        $this->_applyStoresFilter();
        $this->_applyCustomFilter();
    }
    return parent::load($printQuery, $logQuery);
}

Там нет выбора, пока _initSelect называется.

Общий подход, который вы захотите принять здесь

  1. Создайте новый класс модели ресурсов, который расширяет Mage_Reports_Model_Resource_Report_Collection_Abstract учебный класс

  2. Определить а _applyCustomFilter Метод в вашем классе

а затем используйте свою новую модель ресурса. Ваш _applyCustomFilter Метод будет выглядеть примерно так.

protected function _applyCustomFilter()
{
    $return = parent::_applyCustomFilter();
    //manipulate the select all you want here (`$this->getSelect()`)
    return $return;
}

Другие советы

Похоже, вы пытаетесь загрузить список продуктов «самых продаваемых» (и отфильтрованных по данной категории), я делал это в прошлом, используя коллекцию продуктов из модуля отчетов.

Дайте этому шанс:

$category = Mage::getModel('catalog/category')->load(3);
$report = Mage::getResourceModel('reports/product_collection')
        ->addAttributeToSelect('*')
        ->addOrderedQty()
        ->setOrder('ordered_qty', 'desc')
        ->addCategoryFilter($category);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с magento.stackexchange
scroll top