2012-02-09 12 views
5

Estoy usando el siguiente código para obtener algunos datos de una tabla.Obtener cadena de consulta de recopilación

$collection = Mage::getModel('bannerslider/bannerslider')->getCollection() 
     ->addFieldToFilter('status',1) 
     ->addFieldToFilter('is_home',$this->_display) 
    ->addOrder('position', 'ASC') 
     ; 

Sólo por curiosidad, quiero comprobar la consulta que se ejecuta aquí y estoy eco utilizando este código

$collection->printLogQuery(true); 

var_dump((string)$collection->getSelect()); 

Ahora, mi problema es que la cadena

SELECT `main_table`.* FROM `bannerslider` AS `main_table` WHERE (status = '1') AND (is_home = '0') 

no muestra mi última condición, addOrder pero la colección está realmente ordenada por campo de posición, lo comprobé.

Lo que no entiendo es por qué la condición de orden no es visible en la consulta. Gracias.

Respuesta

13

La razón su pedido no aparece es porque las órdenes se añaden a la consulta durante el método load().
Ver Varien_Data_Collection_Db::load()

public function load($printQuery = false, $logQuery = false) 
{ 
    // ... removed for brevity 

    $this->_renderFilters() 
     ->_renderOrders() 
     ->_renderLimit(); 

    $this->printLogQuery($printQuery, $logQuery); 
    $data = $this->getData(); 

    // ... removed for brevity 
} 

Si desea llamar $collection->load(true) se podría ver el SQL que contiene la cláusula ORDER BY.

+0

gracias por su respuesta. eso aclara mi problema – Ovidiu

1

Usted podría tratar de usar el método addAtributeToSort() así:

$collection = Mage::getModel('bannerslider/bannerslider')->getCollection() 
    ->addFieldToFilter('status',1) 
    ->addFieldToFilter('is_home',$this->_display) 
    ->addAtributeToSort('position', 'ASC'); 

Esto funciona en Magento CE 1.5.1, espero que así sea para usted.

+1

El método 'addAttributeToSort()' solo está disponible en colecciones basadas en EAV que se extienden 'Mage_Eav_Model_Entity_Collection_Abstract'. Dado que la consulta en la pregunta se refiere a atributos que deben ser parte de la tabla principal, muy probablemente no sea una entidad basada en EAV. – Vinai

+0

¡Rápido y eficiente, gracias ayudó! – Mateo

+0

además de lo que @Vinai dijo, esa Colección no es parte de la entidad EAV. Es de un módulo con su propia mesa. – Ovidiu

4

Trabajar con la colección de probar la próxima cosas:

$collection->setOrder('position', 'ASC'); // main order setter 
$collectioon->getSelect()->order('position asc'); // alternative order setter 

$collection->load(); // some times you need to call load() to be sure your collection don't get changes later in some place 
echo $collection->getSelect(); // to print query 

creo que sirve

Cuestiones relacionadas