Magento中直接使用SQL语句

原理:

 

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

 

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

 

  1. /** 
  2. * Retrieve Product Attributes Used in Catalog Product listing 
  3. * 
  4. * @return array 
  5. */  
  6. public function getAttributesUsedInListing() {  
  7. $select = $this->_getReadAdapter()->select()  
  8. ->from(array(’main_table’ => $this->getTable(’eav/attribute’)))  
  9. ->join(  
  10. array(’additional_table’ => $this->getTable(’catalog/eav_attribute’)),  
  11. ‘main_table.attribute_id = additional_table.attribute_id’,  
  12. array()  
  13. )  
  14. ->joinLeft(  
  15. array(’al’ => $this->getTable(’eav/attribute_label’)),  
  16. ‘al.attribute_id = main_table.attribute_id AND al.store_id = ‘ . (int) $this->getStoreId(),  
  17. array(’store_label’ => new Zend_Db_Expr(’IFNULL(al.value, main_table.frontend_label)’))  
  18. )  
  19. ->where(’main_table.entity_type_id=?’, $this->getEntityTypeId())  
  20. ->where(’additional_table.used_in_product_listing=?’, 1);  
  21. – $sql = $select->assemble();  
  22. – echo $sql;  
  23. return $this->_getReadAdapter()->fetchAll($select);  
  24. }  
 

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

 

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

 

Magento中打印SQL语句来调试

 

有时为了调试magento商城系统,需要获取当前的查询sql语句,magento中获取SQL语句,这里我们通过


$collection->getSelectSql(true)来调试sql


  1. $collection=Mage::getResourceModel('reports/product_collection');  
  2. $query=$collection->getSelectSql(true);  
  3. echo $query;  
 

magento获取SQL语句的另外一种方法是设置打印SQL为true


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

得到的SQL语句


  1. SELECT `e`.* FROM `catalog_product_entity` AS `e`  
 

这里只是打印查询产品的SQL,如果要获取其他地方的SQL语句,道理也是一样的,我们根据上面的sql语句可以看到,其实magento的性能很差,"select *",magetno又是基于EAV架构的,可以想象下这速度


操作:

 

Magento的Models 和Collection 很强大,使用它们可以很方便的查询和操作数据库。但是有些场合,因为一些特殊需求或对Magento的了解不够深,可能会需要自己手写SQL语句来查询和操作数据库。以下分别是读写数据库的代码。

 

  1. // For Read  
  2. // fetch read database connection that is used in Mage_Core module  
  3.   
  4. $read= Mage::getSingleton('core/resource')->getConnection('core_read');  
  5.   
  6. // first way  
  7. $query = $read->query("select name from core_website");  
  8. while ($row = $query->fetch())   
  9. {   
  10.     $row = new Varien_Object($row);    
  11.     echo "<strong>" . $row->getName() . "</strong><br/>";  
  12. }  
  13.   
  14. // second way   
  15. $results = $read->fetchAll("SELECT * FROM core_website;");   
  16. foreach ($results as $row)   
  17. {  
  18.     echo $row['name'] . "<br/>";    
  19. }   
  1. // For Write  
  2. // fetch write database connection that is used in Mage_Core module  
  3. $write = Mage::getSingleton('core/resource')->getConnection('core_write');  
  4.   
  5. // now $write is an instance of Zend_Db_Adapter_Abstract  
  6. $write->query("insert into tablename values ('aaa','bbb','ccc')");  

 

注意上面的getConnection()方法中的参数 "core_read",表明了Magento将要使用的资源。与之相对应,当我们修改数据库的时候使用参数"core_write".一般情况下getConnection方法的参数应设成"core_read" 或 "core_write"(应该不指定也是可以的,但是如果Magento有多个数据库就必须指定了)。

 

作为新的entension module,在config.xml对"core_read" "core_write" 进行定义是个好的习惯。定义如下: 

  1. <config>  
  2.     <global>  
  3.         <resources>  
  4.             <extension_setup>  
  5.                 <connection>  
  6.                     <use>core_setup</use>  
  7.                 </connection>  
  8.             </extension_setup>  
  9.             <extension_read>  
  10.                 <connection>  
  11.                     <use>core_read</use>  
  12.                 </connection>  
  13.             </extension_read>  
  14.             <extension_write>  
  15.                 <connection>  
  16.                     <use>core_write</use>  
  17.                 </connection>  
  18.             </extension_write>  
  19.         </resources>  
  20.     </global>  
  21. </config>  
 

对应上面新增的module的名字.使用下面相对应的语句在read或write Database:

  1. $conn = Mage::getSingleton('core/resource')->getConnection('extension_read');  
  2. $conn = Mage::getSingleton('core/resource')->getConnection('extension_write');  
 

一般情况是绝大多数的module都定义成"core_read" "core_write"方便且节省资源。当然特殊情况除外:

  • 给每个module不同的读写权限
  • 需要用多个Database
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值