2012-02-09 117 views
5

我正在使用以下代碼從表中獲取一些數據。獲取收集查詢字符串

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

只是爲了我的好奇心,我要檢查這裏執行的查詢,我使用此代碼

$collection->printLogQuery(true); 

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

現在迴音,我的問題是,串

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

沒有顯示我的最後一個條件,addOrder但收集真的按位置字段排序,我檢查了這一點。

我不明白爲什麼訂單條件在查詢中不可見。 謝謝。

回答

13

您的訂單無法顯示的原因是因爲訂單的load()方法中添加到查詢。
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 
} 

如果你會打電話$collection->load(true),你會看到一個包含order by子句中的SQL。

+0

謝謝你的回答。這澄清了我的問題。 – Ovidiu 2012-02-10 16:30:43

1

你可以嘗試使用addAtributeToSort()方法是這樣的:

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

這部作品Magento的CE 1.5.1,我希望它會爲你。

+1

'addAttributeToSort()'方法僅適用於擴展'Mage_Eav_Model_Entity_Collection_Abstract'的基於EAV的集合。由於問題中的查詢是指必須是主表的一部分的屬性,因此它很可能不是基於EAV的實體。 – Vinai 2012-02-09 11:35:13

+0

快速高效,謝謝幫助! – Mateo 2012-02-09 15:25:50

+0

除了@Vinai所說的,那個Collection不是EAV實體的一部分。它來自具有自己的表格的模塊。 – Ovidiu 2012-02-10 16:31:34

4

與收集工作嘗試下一個事情:

$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 

希望它可以幫助