2012-02-09 12 views
5

Korzystam z poniższego kodu, aby pobrać dane z tabeli.Pobierz ciąg zapytania o kolekcję

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

Tylko dla mojej ciekawości, chcę sprawdzić kwerendę, która jest wykonywana tutaj i mam echo za pomocą tego kodu

$collection->printLogQuery(true); 

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

Teraz moim problemem jest to, że ciąg

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

nie pokazuje mojego ostatniego warunku, addOrder, ale kolekcja jest naprawdę uporządkowana według pola pozycji, sprawdziłem to.

Nie rozumiem, dlaczego warunek zamówienia nie jest widoczny w zapytaniu. Dziękuję.

Odpowiedz

13

Powodem zamówienie nie pokazuje się tak dlatego, że zlecenia są dodawane do zapytania podczas metody load().
Zobacz 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 
} 

Jeśli chcesz zadzwonić $collection->load(true) można zobaczyć SQL zawierające klauzuli ORDER BY.

+0

dziękuję za odpowiedź. to wyjaśnia mój problem. – Ovidiu

1

Można spróbować przy użyciu metody addAtributeToSort() tak:

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

Działa to na Magento CE 1.5.1, mam nadzieję, że będzie dla Ciebie.

+1

Metoda 'addAttributeToSort()' jest dostępna tylko w kolekcjach opartych na EAV rozszerzających 'Mage_Eav_Model_Entity_Collection_Abstract'. Ponieważ zapytanie w pytaniu odnosi się do atrybutów, które muszą być częścią głównej tabeli, prawdopodobnie nie jest to jednostka oparta na EAV. – Vinai

+0

Szybkie i wydajne, dzięki to pomogło! – Mateo

+0

oprócz tego, co powiedział @Vinai, ta kolekcja nie jest częścią encji EAV. Jest z modułu z własnym stołem. – Ovidiu

4

Praca z kolekcji próbować kolejnych rzeczy:

$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 

Nadzieja pomaga

Powiązane problemy