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);
¿Fue útil?

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

  1. Crea una nueva clase de modelo de recurso que se extiende la clase Mage_Reports_Model_Resource_Report_Collection_Abstract

  2. 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);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a magento.stackexchange
scroll top