最新消息:Excel无乱码转CSV,由于工作原因很少更新博客和回复大家的评论,非常抱歉。

在Magento中直接使用SQL语句

原理

magento是基于Zend Framework的,所以底层用的还是zend的zend db

在文件app/code/core/Mage/Catalog/model/Resource/Eav /Mysql4/Config.php 中追踪到下面的函数 getAttributesUsedInListing()

/**
* Retrieve Product Attributes Used in Catalog Product listing
*
* @return array
*/
public function getAttributesUsedInListing() {
$select = $this->_getReadAdapter()->select()
->from(array(’main_table’ => $this->getTable(’eav/attribute’)))
->join(
array(’additional_table’ => $this->getTable(’catalog/eav_attribute’)),
‘main_table.attribute_id = additional_table.attribute_id’,
array()
)
->joinLeft(
array(’al’ => $this->getTable(’eav/attribute_label’)),
‘al.attribute_id = main_table.attribute_id AND al.store_id = ‘ . (int) $this->getStoreId(),
array(’store_label’ => new Zend_Db_Expr(’IFNULL(al.value, main_table.frontend_label)’))
)
->where(’main_table.entity_type_id=?’, $this->getEntityTypeId())
->where(’additional_table.used_in_product_listing=?’, 1);
– $sql = $select->assemble();
– echo $sql;
return $this->_getReadAdapter()->fetchAll($select);
}

Magento操作数据库是在 Zend DB(Zend Framework)的基础上简单的做了下封装了。Zend DB 有自己的一套规则,来组合生成最终的SQL查询语句,可以看到上面的代码中有 from() join() joinLeft() where() 等函数,乱七八糟的一大堆东西,需要对 Zend DB的规则非常熟悉,才能知道实际执行的SQL语句,有没有办法直接打印出SQL语句?找了下,还真有,就是assemble()函数。

在上面代码中最后 部分可以看到,顺便把SQL也附上来:

SELECT `main_table`.*, IFNULL(al.value, main_table.frontend_label) AS `store_label` FROM `eav_attribute` AS `main_table` INNER JOIN `catalog_eav_attribute` AS `additional_table` ON main_table.attribute_id = additional_table.attribute_id LEFT JOIN `eav_attribute_label` AS `al` ON al.attribute_id = main_table.attribute_id AND al.store_id = 1 WHERE (main_table.entity_type_id=’4′) AND (additional_table.used_in_product_listing=1)

在做开发时有的时候迷惑,Magento都提供了数据的对象,那该如何查询自定义的SQL语句呢.

其实Magento已经想过这个问题了.

只需instance core/resource的对象进行connect就能得到数据访问的对象了.语法是跟Zend_Db一致的.

看代码:

<?php

//select query

$read = Mage::getSingleton('core/resource')->getConnection('core_read');

//make connection

$qry = "select name FROM user_data WHERE id=1 LIMIT 1 "; //query

$res = $read->fetchRow($qry); //fetch row

$name = $res['name']; //outputs name

//other form

$qry = "select name FROM user_data WHERE namer LIKE '%a%' ";//query

$res = $read->fetchAll($qry); //get array

//Insert query

$write =  Mage::getSingleton('core/resource')->getConnection('core_write');

$sql  = "INSERT INTO user_data values (?,?)"; //insert query

$write->query($sql, array('name','pass')); //write to database

?>

像fetch fetchall这样的方法是不是以前经常用到,没错.Zend_Db同样和PDO的风格差不多.

转载请注明:嗨酷哥,有你更酷! » 在Magento中直接使用SQL语句

与本文相关文章

发表我的评论

取消评论
表情 插代码

Hi,您需要填写昵称和邮箱!

  • 必填项
  • 必填项