`
hudeyong926
  • 浏览: 2018471 次
  • 来自: 武汉
社区版块
存档分类
最新评论

magento model collection

 
阅读更多

colleciton的启用

Ticket\Model\Log.php
Ticket\Model\Mysql4\Log.php
Ticket\Model\Mysql4\Log\Collection.php
<?php
class Test_Ticket_Model_Mysql4_Log_Collection extends Mage_Core_Model_Mysql4_Collection_Abstract
{
    public function _construct()
    {
        parent::_construct();
        $this->_init('ticket/log');
    }
    public function getOrderTotalByState($state) {
        $this->getSelect()
            ->reset('columns')
            ->where('customer_id=?', Mage::getSingleton('customer/session')->getCustomer()->getId())
            ->where('state=?', $state)
            ->columns(new Zend_Db_Expr('count(*) as total'));
//        echo $this->getSelect();
        return $this->fetchItem()->getData('total');
    }
}

使用colleciton->getSelectSql()输出运行的SQL语句

<?php
$collection = Mage::getModel('catalog/category')->getCollection();
echo $collection->getSelectSql(true);
$collection->getSelectSql()->__toString();
?>

magento获取SQL语句的另外一种方法是设置打印SQL为true,collection全路径写法

$collection=Mage::getResourceModel('reports/product_collection');
$collection->printlogquery(true);

对模型对应的表集合进行排序

$collection = Mage::getModel('module/model_name')->getCollection();
$collection->getSelect()->order('last_name ASC');

 对多个字段进行排序

$collection = Mage::getModel('module/model_name')->getCollection();
$collection->getSelect()->order( array('order ASC','last_name ASC', 'first_name ASC') );

3. 使用IF/THEN

$collection = Mage::getModel('module/model_name')->getCollection();
$collection->getSelect()->order( array('IF(`order`>0, `order`, 9999) ASC','last_name ASC', 'first_name ASC') );

 在上面的例子中,如果order大于0并且小于等于9999按照升序排列,然后按last_name, first_name升序排列。

得到所有的记录明细非分页

$collection->toArray();

config.xml中的global标签 获取数据库配置信息

$dbname = (String) Mage::getConfig()->getNode('global/resources/default_setup/connection/dbname');
$host = (String) Mage::getConfig()->getNode('global/resources/default_setup/connection/host');
$user = (String) Mage::getConfig()->getNode('global/resources/default_setup/connection/username');
$pwd = (String) Mage::getConfig()->getNode('global/resources/default_setup/connection/password');

根据xml文件中的节点往下找就可以找到对应的字段

同理

<global>
	<test>
		<virtualcard>
			<separator>-</separator>
			<charset>
				<alphanum>ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789</alphanum>
				<alpha>ABCDEFGHIJKLMNOPQRSTUVWXYZ</alpha>
				<num>0123456789</num>
			</charset>
		</virtualcard>
	</test>
</global>

 调用方法

const XML_CHARSET_SEPARATOR = 'global/test/virtualcard/separator';
public function getCodeSeparator()
{
	return (string) Mage::app()->getConfig()->getNode(self::XML_CHARSET_SEPARATOR);
}

Join联表查询

$collection = Mage::getModel('ticket/ticket')->getCollection();
$collection->join('log','(main_table.id=log.ticketid and log.status>0)',array(''));//non select
if($status){
	$collection->addFieldToFilter('log.status', $status);
}
$collection->addFieldToFilter('main_table.status', array("gt"=>0));

/*$collection->getSelect()->joinLeft
→joinInner() →joinLeft() →joinRight() →joinFull() →joinCross() →joinNatural()*/
$collection->getSelect()->joinLeft(array('o'=>'sales_flat_order'),'main_table.order_id = o.entity_id','grand_total');

分组

$collection->getSelect()->group('entity_id');
#$collection->groupByAttribute('entity_id');

分页

Mage::getModel('catalog/product')->getCollection()->addAttributeToSort('stdate','desc')
->setPageSize(10)->setCurPage(2);
 
$collection->getSelect()->limitPage(2,10);

只选某一个字段,点击Grid header可以排序

Mage::getModel('catalog/product')->getCollection()->addAttributeToSelect('price')->setOrder('id','desc');

在这里我将Magento addFieldToFilter 所有的条件判断符号列出来供大家参考。

array("eq"=>'n2610')
WHERE (e.sku = 'n2610')
//$collection->getSelect()->where('order_id =5');
array("neq"=>'n2610')
WHERE (e.sku != 'n2610')

array("like"=>'n2610')
WHERE (e.sku like 'n2610')

array("nlike"=>'n2610')
WHERE (e.sku not like 'n2610')

array("is"=>'n2610')
WHERE (e.sku is 'n2610')

array("in"=>array('n2610','ABC123')
WHERE (e.sku in ('n2610','ABC123'))

array("nin"=>array('n2610'))
WHERE (e.sku not in ('n2610'))

array("notnull"=>'n2610')
WHERE (e.sku is NOT NULL)

array("null"=>'n2610') //关键字NULL是最特殊的sql句,它将忽略你传入的值。
WHERE (e.sku is NULL) 

array("gt"=>'n2610')
WHERE (e.sku > 'n2610')

array("lt"=>'n2610')
WHERE (e.sku < 'n2610')

array("gteq"=>'n2610')
WHERE (e.sku >= 'n2610')

array("moreq"=>'n2610') 
WHERE (e.sku >= 'n2610')

array("lteq"=>'n2610')
WHERE (e.sku <= 'n2610')

array("finset"=>array('n2610'))
WHERE (find_in_set('n2610',e.sku))

array('from'=>'10','to'=>'20')
WHERE e.sku >= '10' and e.sku <= '20'

addFieldToFilter 一个字段只能加一次,后面会替换前面的

if($parms['dt_start']&&empty($parms['dt_end'])){
	$pointParams['created_at'] = array('gteq'=>trim($parms['dt_start']));
}
if($parms['dt_end']&&empty($parms['dt_start'])){
	$pointParams['created_at'] = array('lteq'=>trim($parms['dt_end']));
}
if($parms['dt_end']&&$parms['dt_start']){
	$pointParams['created_at'] = array('from'=>trim($parms['dt_start']),'to'=>trim($parms['dt_end']));		
}

magento当使用group语句进行分页出现bug ,需修改文件 lib/Varien/Data/Collection/Db.php

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;
}

推荐在子类Collection中设置

$this->_totalRecords

dfghdfgd

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics