Unirse a un modelo de recurso que no tiene un Select?
-
16-10-2019 - |
Pregunta
Así que tiene este modelo de recurso que me sacó de alguna clave de administrador en el salpicadero. Funciona, pero me parece que no puede unirse a ella. Haciendo shows ->getSelect()->__toString();
nada? Así que no es esto una colección normal? ¿Por qué no funciona igual que otras colecciones?
Mi suposición de que para lograr lo que quiero lograr es que voy a tener que extender el modelo de recogida, pero yo sólo quería ver si puedo conseguir más de una idea de lo que está pasando aquí.
$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);
Solución
Las colecciones de informes funciona un poco diferente que las colecciones Mage_Core_Model_Abstract
/ CRUD. Las colecciones CRUD tendrán una consulta SQL asignado inmediatamente a la instanciación. La colección de informes, sin embargo, inicializa su instrucción SQL durante su operación de carga. Esto se puede ver en el método load
en la clase base abstracta para todas las colecciones de información.
#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);
}
No hay Select hasta _initSelect
se llama.
El enfoque general que tendrá que tomar aquí es
-
Crea una nueva clase de modelo de recurso que se extiende la clase
Mage_Reports_Model_Resource_Report_Collection_Abstract
-
Definir un método
_applyCustomFilter
en su clase
y luego usar su nuevo modelo de recursos. Su método _applyCustomFilter
sería algo como esto.
protected function _applyCustomFilter()
{
$return = parent::_applyCustomFilter();
//manipulate the select all you want here (`$this->getSelect()`)
return $return;
}
Otros consejos
Parece que estás tratando de cargar una lista de productos "descendiente" (y filtrada por una categoría dada), lo he hecho en el pasado mediante la recogida del producto desde el módulo Informes.
Dar a este un tiro:
$category = Mage::getModel('catalog/category')->load(3);
$report = Mage::getResourceModel('reports/product_collection')
->addAttributeToSelect('*')
->addOrderedQty()
->setOrder('ordered_qty', 'desc')
->addCategoryFilter($category);