Partecipare ad un modello di risorse che non dispone di una Select?
-
16-10-2019 - |
Domanda
Così ho questo modello risorsa che ho tirato da un certo codice di amministrazione sul cruscotto. Funziona, ma non riesco ad unirsi ad esso. Facendo spettacoli ->getSelect()->__toString();
nulla? Quindi è questo non una collezione normale? Perché non funzionano come altre collezioni?
La mia ipotesi che, al fine di realizzare quello che voglio realizzare è che sto andando ad avere per estendere il modello di raccolta, ma volevo solo vedere se riesco a ottenere più di un'idea di quello che sta succedendo qui.
$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);
Soluzione
Le collezioni di reporting funziona un po 'diverso che le collezioni Mage_Core_Model_Abstract
/ CRUD. Le collezioni CRUD avranno una query SQL assegnato subito a esemplificazione. La collezione di report, tuttavia, inizializza il proprio istruzione SQL durante il suo funzionamento a carico. Si può vedere questo nel metodo load
giù nella classe base astratta per tutte le collezioni di segnalazione.
#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);
}
Non c'è alcun selezionare fino _initSelect
viene chiamato.
L'approccio generale si vorrà prendere qui è
-
Creare una nuova classe modello di risorse che estende la classe
Mage_Reports_Model_Resource_Report_Collection_Abstract
-
Definire un metodo
_applyCustomFilter
nella classe
e quindi utilizzare il nuovo modello di risorse. Il tuo metodo _applyCustomFilter
sarebbe simile a questa.
protected function _applyCustomFilter()
{
$return = parent::_applyCustomFilter();
//manipulate the select all you want here (`$this->getSelect()`)
return $return;
}
Altri suggerimenti
sembra che si sta cercando di caricare un elenco di prodotti "best seller" (e filtrata da una data categoria), ho fatto in passato con la raccolta del prodotto dal modulo Reports.
Dare a questo un colpo:
$category = Mage::getModel('catalog/category')->load(3);
$report = Mage::getResourceModel('reports/product_collection')
->addAttributeToSelect('*')
->addOrderedQty()
->setOrder('ordered_qty', 'desc')
->addCategoryFilter($category);