回答:
最初に行う必要があるのは、モジュールの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テーブルで読み取り接続のみを作成するカスタムレポートモジュールがあります。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){ if(isset($ this-> _ connections [$ connectionName])){ return $ this-> _ connections [$ connectionName]; } if($ connectionName == 'read' && $ this-> reportConnection) $ this-> _ connections [$ connectionName] = $ this-> _ resources-> getConnection( 'test_read'); そうしないと{ if(!empty($ this-> _ resourcePrefix)){ $ this-> _ connections [$ connectionName] = $ this-> _ resources-> getConnection( $ this-> _ resourcePrefix。'_'。$ connectionName); } そうしないと { $ this-> _ connections [$ connectionName] = $ this-> _ resources-> getConnection($ connectionName); } } return $ 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);
?>