Answers:
您需要做的第一件事是在模块的config.xml中创建一个连接。它看起来应该与您的default_setup
中的相似/app/etc/local.xml
。在这里,您可以将主机指定为localhost,然后设置另一个dbname,也可以完全指定另一个主机。我还使用了一个插座,在此之前也可以使用。
<resources>
<new_db>
<connection>
<host><![CDATA[localhost]]></host>
<username><![CDATA[db_username]]></username>
<password><![CDATA[db_password]]></password>
<dbname><![CDATA[db_name]]></dbname>
<model>mysql4</model>
<type>pdo_mysql</type>
<active>1</active>
</connection>
</new_db>
</resources>
现在,在此之后,您将能够连接到该数据库并执行如下查询:
$new_db_resource = Mage::getSingleton('core/resource');
$connection = $new_db_resource->getConnection('new_db');
$results = $connection->query('SELECT * FROM table');
如果您想通过一个模型要做到这一点,那么你可以指定read
,write
并且setup
资源,如下所示。这将再次resources
在config.xml中的节点内完成,您应该替换test
为已设置为模型的模型。
<resources>
<new_db>
<connection>
<host><![CDATA[localhost]]></host>
<username><![CDATA[db_username]]></username>
<password><![CDATA[db_password]]></password>
<dbname><![CDATA[db_name]]></dbname>
<model>mysql4</model>
<type>pdo_mysql</type>
<active>1</active>
</connection>
</new_db>
<test_write>
<connection>
<use>new_db</use>
</connection>
</test_write>
<test_read>
<connection>
<use>new_db</use>
</connection>
</test_read>
<test_setup>
<connection>
<use>new_db</use>
</connection>
</test_setup>
</resources>
<models>
<test>
<class>My_Test_Model</class>
<resourceModel>test_resource</resourceModel>
</test>
<test_resource>
<class>My_Test_Model_Resource</class>
<entities>
<test>
<table>test</table>
</test>
</entities>
</test_resource>
</models>
模型本身将尝试在函数中找到其连接信息getConnection
/app/code/core/Mage/Core/Model/Resource.php
。如果你登录的$name
传递,你会看到这样的值poll_write
,tag_write
并且cms_read
其中第一部分车型部分匹配的config.xml中,在我们的情况下,你会看到test_write
,test_read
或test_setup
。如果找不到与之匹配的连接core_read
,则将使用默认连接,core_write
或者core_setup
阅读完所有这些答案之后,搜索并进行了一些测试,我找到了这个解决方案。这是我写解决方案的博客。
使用Magento 1.9时,我被要求进行多个读取和写入连接。Magento可以在/etc/local.xml中配置读写连接。只需设置标签用途即可让Magento知道哪一个可用。
<default_setup>
<connection>
<!-- LOCALHOST -->
<host>localhost</host>
<username>root</username>
<password>123456</password>
<dbname>magento_db</dbname>
<initstatements>SET NAMES utf8</initstatements>
<model>mysql4</model>
<type>pdo_mysql</type>
<pdotype></pdotype>
<active>1</active>
</connection>
</default_setup>
<default_read>
<connection>
<use/>
<!-- ANOTHER SERVER -->
<host>other_server</host>
<username>root</username>
<password>123456</password>
<dbname>magento_db</dbname>
<initstatements>SET NAMES utf8</initstatements>
<model>mysql4</model>
<type>pdo_mysql</type>
<pdotype></pdotype>
<active>1</active>
</use></connection>
</default_read>
<default_write>
<connection>
<use/>
<!-- LOCALHOST -->
<host>localhost</host>
<username>root</username>
<password>123456</password>
<dbname>magento_db</dbname>
<initstatements>SET NAMES utf8</initstatements>
<model>mysql4</model>
<type>pdo_mysql</type>
<pdotype></pdotype>
<active>1</active>
</use></connection>
</default_write>
我们可以像本测试示例一样在同一配置文件中定义n个连接
<test_read>
<connection>
<!-- TEST SERVER -->
<host>test_server</host>
<username>root</username>
<password>123456</password>
<dbname>magento_db</dbname>
<initstatements>SET NAMES utf8</initstatements>
<model>mysql4</model>
<type>pdo_mysql</type>
<pdotype></pdotype>
<active>1</active>
</connection>
</test_read>
限制是将连接应用于整个系统,但我的想法是仅针对某些资源进行设置。在这种情况下,我有一个自定义报告模块,我只想在Order表中建立读取连接。覆盖订单资源后Mage / Sales / Model / Resource / Order.php只需进行3次更新
//旗 public $ reportConnection = false; / ** *只需添加在local.xml'test_read'中定义的连接 * / 受保护的函数_construct(){ $ this-> _ init('sales / order','entity_id'); $ this-> _ resources-> getConnection('test_read'); } / ** *如果设置了标志,则进行连接 * / 受保护的函数_getConnection($ connectionName){ 如果(isset($ this-> _ connections [$ connectionName])){ 返回$ this-> _ connections [$ connectionName]; } if($ connectionName =='read'&& $ this-> reportConnection) $ this-> _ connections [$ connectionName] = $ this-> _ resources-> getConnection('test_read'); 其他{ 如果(!empty($ this-> _ resourcePrefix)){ $ this-> _ connections [$ connectionName] = $ this-> _ resources-> getConnection( $ this-> _ resourcePrefix。'_' $ connectionName); }其他{ $ this-> _ connections [$ connectionName] = $ this-> _ resources-> getConnection($ connectionName); } } 返回$ this-> _ connections [$ connectionName]; }
最后一步是使用test_read连接调用Order集合。
//Get the Order model
$model = Mage::getModel('sales/order');
//set the flag
$model->getResource()->reportConnection = true;
//get the collection
$collection = $model->getCollection();
在模块etc / config.xml中添加以下代码:
<global>
<resources>
<modulename_write>
<connection>
<use>modulename_database</use>
</connection>
</modulename_write>
<modulename_read>
<connection>
<use>modulename_database</use>
</connection>
</modulename_read>
<modulename_setup>
<connection>
<use>core_setup</use>
</connection>
</modulename_setup>
<modulename_database>
<connection>
<host><![CDATA[localhost]]></host>
<username><![CDATA[db_username]]></username>
<password><![CDATA[db_password]]></password>
<dbname><![CDATA[tablename]]></dbname>
<model>mysql4</model>
<type>pdo_mysql</type>
<active>1</active>
</connection>
</modulename_database>
</resources>
</global>
要使用新数据库从表中获取数据:
<?php
$resource = Mage::getSingleton('core/resource');
$conn = $resource->getConnection('modulename_read');
$results = $conn->fetchAll('SELECT * FROM tablename');
echo "<pre>";
print_r($results);
?>