2010-08-14 11 views
8

Cuando estoy usandoutilizando grupo() rompe getSelectCountSql en Magento

$collection->getSelect()->group('entity_id') 

o

$collection->groupByAttribute('entity_id') 

Rompe getSelectCountSql y yo estoy poniendo 1 disco y 1 página. Magento hace

$countSelect->columns('COUNT(DISTINCT e.entity_id)'); 

¿Hay alguna manera de solucionarlo?

me encuentro con él, mientras se sobreescriben _prepareCollection de Mage_Adminhtml_Block_Catalog_Product_Grid

Gracias

+0

¿Por qué no solo usa un conteo php normal() en la colección devuelta? – silvo

+5

Porque no es una cosa MySQL una cosa php. Cuando se llama a contar con una colección, php llama a la función que ejecuta una consulta MySQL. – pablo

Respuesta

25

I actualizado el/ archivo lib Varien/Datos/Colección/db.php para permitir esto como que tenía que tener que funcione . Vas a tener que realizar un seguimiento de esto para las actualizaciones, pero funciona.

public function getSelectCountSql() 
{ 
    $this->_renderFilters(); 
    $countSelect = clone $this->getSelect(); 
    $countSelect->reset(Zend_Db_Select::ORDER); 
    $countSelect->reset(Zend_Db_Select::LIMIT_COUNT); 
    $countSelect->reset(Zend_Db_Select::LIMIT_OFFSET); 
    $countSelect->reset(Zend_Db_Select::COLUMNS); 

    // Count doesn't work with group by columns keep the group by 
    if(count($this->getSelect()->getPart(Zend_Db_Select::GROUP)) > 0) { 
     $countSelect->reset(Zend_Db_Select::GROUP); 
     $countSelect->distinct(true); 
     $group = $this->getSelect()->getPart(Zend_Db_Select::GROUP); 
     $countSelect->columns("COUNT(DISTINCT ".implode(", ", $group).")"); 
    } else { 
     $countSelect->columns('COUNT(*)'); 
    } 
    return $countSelect; 
} 
+13

Las clases Varien pueden anularse en el directorio 'app/code/local' de la misma manera que las clases Mage. Úselo en lugar de "hacer un seguimiento de las actualizaciones". – clockworkgeek

+0

+1 a @clockworkgeek - 4 años de sólido trabajo en Magento y nunca supe que podría reemplazar a lib/Varien desde la aplicación/código/local. Aclamaciones. – philwinkle

+5

Para aclarar: copie lib/Varien/Data/Collection/Db.php en app/code/local/Varien/Data/Collection/Db.php y edítelo allí. – mniess

0

Muy buen artículo Éstos son algunos cambios que he realizado con el fin de hacer que funcione para mí

Los cambios sugeridos en db.php no son necesarios para la resolución de grupo en la recolección por catálogo. hice el cambio similar en Catalogo-> Modelo-> Ressource-> EAV-> Mysql4-> producto-> collection.php Aquí está el código añadí a getSelectCountSql()

if(count($this->getSelect()->getPart(Zend_Db_Select::GROUP)) > 0) { $countSelect->reset(Zend_Db_Select::GROUP); } 

Después de esto las cosas se resuelve, pero aparece un nuevo problema. En cantidades de navegación en capas para todos los filtros es 1.

0

Lo hice sin tocar los archivos Core anulando el método getSize() de mi colección.

public function getSize() 
{ 
    if (count($this->getSelect()->getPart(Zend_Db_Select::GROUP)) > 0) { 

     // Create a new collection from ids because we need a fresh select 
     $ids = $this->getAllIds(); 
     $new_coll = Mage::getModel('module_key/model')->getCollection() 
       ->addFieldToFilter('id', array('in' => $ids)); 

     // return the collection size 
     return $new_coll->getSize(); 
    } 

    return parent::getSize(); 
} 

Dime si funciona para usted ..

Bouni

3

en algunos casos, el método de Eric no funciona.

Es mejor escribir de nuevo el método getSize() a

public function getSize() 
{ 
    if (is_null($this->_totalRecords)) { 
     $sql = $this->getSelectCountSql(); 

     $result = $this->getConnection()->fetchAll($sql, $this->_bindParams);; 

     foreach ($result as $row) { 
      $this->_totalRecords += reset($row); 
     } 

    } 
    return intval($this->_totalRecords); 
} 
1

He resuelto este uso de la función a continuación:

public function getSize() 
{ 
    return sizeof($this->getAllIds()); 
} 

Esto me ayudó en la edición de getSize() regresar 1 cargo de la recolección de productos en Magento CE 1.5.

he sobrescrito el archivo Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Collection y lugar por encima de la función.

Cuestiones relacionadas