Rejoindre un modèle de ressources qui ne dispose pas d'un Select?
-
16-10-2019 - |
Question
J'ai donc ce modèle de ressources que j'ai tiré à partir du code d'administration sur le tableau de bord. Il fonctionne, mais je ne peux pas sembler à se joindre à elle. Faire des spectacles de ->getSelect()->__toString();
rien? Alors, est-ce pas une collection normale? Pourquoi est-il pas de travail comme les autres collections?
Je pense que pour accomplir ce que je veux accomplir est que je vais devoir étendre le modèle de collection, mais je voulais juste voir si je peux obtenir plus d'une idée de ce qui se passe ici.
$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);
La solution
Les collections de rapports fonctionne un peu différemment que les collections Mage_Core_Model_Abstract
/ CRUD. Les collections de CRUD auront une requête SQL attribué immédiatement à l'instanciation. La collection de rapports, toutefois, initialise son instruction SQL lors de son opération de chargement. Vous pouvez le voir dans la méthode load
dans la classe de base abstraite pour toutes les collections de rapports.
#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);
}
Il n'y a pas jusqu'à sélectionner _initSelect
est appelé.
L'approche générale que vous aurez envie de prendre ici est
-
Créer une nouvelle classe de modèle de ressource qui étend la classe
Mage_Reports_Model_Resource_Report_Collection_Abstract
-
Définir une méthode
_applyCustomFilter
dans votre classe
puis utilisez votre nouveau modèle de ressources. Votre méthode _applyCustomFilter
ressemblerait à quelque chose comme ça.
protected function _applyCustomFilter()
{
$return = parent::_applyCustomFilter();
//manipulate the select all you want here (`$this->getSelect()`)
return $return;
}
Autres conseils
On dirait que vous essayez de charger une liste de produits « meilleure vente » (et filtrée par une catégorie donnée), je l'ai fait dans le passé en utilisant la collection de produits à partir du module Rapports.
Donner cette une photo:
$category = Mage::getModel('catalog/category')->load(3);
$report = Mage::getResourceModel('reports/product_collection')
->addAttributeToSelect('*')
->addOrderedQty()
->setOrder('ordered_qty', 'desc')
->addCategoryFilter($category);