Присоединение к модели ресурса, у которой нет выбора?
-
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
называется.
Общий подход, который вы захотите принять здесь
Создайте новый класс модели ресурсов, который расширяет
Mage_Reports_Model_Resource_Report_Collection_Abstract
учебный классОпределить а
_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);