本文已移到:http://www.iifire.com
Magento 和 zend framework 的DB层都完全实现了抽象(封装成类了),这样方便我们在使用数据库资源时直接调用相关的Resource类而不用理会DB底层的具体实现方法,会用就可。但是我们有时候希望能直接使用SQL语句来从表中查询和更新数据,该怎么办呢?当然Magento中提供了相关的方法,如下:
$conn = Mage::getSingleton('core/resource')->getConnection('core_read');
上面的的语句返回 Varien_Db_Adapter_Pdo_Mysql对象的一个实例( Zend_Db_Adapter_Abstract 的子类), 该类提供了直接调用SQL语句的方法.例:
// Prints a list of all website names
$results = $conn->fetchAll("SELECT * FROM core_website;");
foreach($results as $row) {
echo $row['name'] . "\n";
}
注意上面的getConnection()方法中的参数 "core_read",表明了Magento将要使用的资源。与之相对应,当我们修改数据库的时候使用参数"core_write".一般情况下getConnection方法的参数应设成"core_read" 或 "core_write"(应该不指定也是可以的,但是如果Magento有多个数据库就必须指定了)。
作为新的entension module,在config.xml对"core_read" "core_write" 进行定义是个好的习惯。定义如下: c
<config>
<global>
<resources>
<extension_setup>
<connection>
<use>core_setup</use>
</connection>
</extension_setup>
<extension_read>
<connection>
<use>core_read</use>
</connection>
</extension_read>
<extension_write>
<connection>
<use>core_write</use>
</connection>
</extension_write>
</resources>
</global>
</config>
对应上面新增的module的名字.使用下面相对应的语句在read或write Database:
$conn = Mage::getSingleton('core/resource')->getConnection('extension_read');
$conn = Mage::getSingleton('core/resource')->getConnection('extension_write');
一般情况是绝大多数的module都定义成"core_read" "core_write"方便且节省资源。当然特殊情况除外:
- 给每个module不同的读写权限
- 需要用多个Database