2012-02-09 103 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 

希望它可以帮助