magentoから別のデータベースに接続する方法


17

Magentoから別のデータベースに接続してデータにアクセスすることはできますか?

モジュールを作成する必要がある場合、別のデータベースにアクセスするモジュールを作成するにはどうすればよいですか?同じことを最初から説明するチュートリアルはありますか?何か案が?

回答:


18

最初に行う必要があるのは、モジュールの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');

モデルを介してこれを行う場合、次のようにreadwriteおよびsetupリソースを指定できます。これは再びresourcesconfig.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_writetag_writeそしてcms_read最初の部分は、config.xmlにモデルの部分と一致する場合には、我々の場合には、あなたが見ることtest_writetest_readまたはtest_setup。これに一致する接続が見つからない場合、デフォルトの接続を使用しますcore_readcore_writeまたはcore_setup


申し訳ありませんが、うまくいきません。
バブ

このコードを書く場所、クエリを実行する場所、これを変更する場所がわかりません。たとえば、<host> <![CDATA [localhost]]> </ host>または<host> localhost </と入力するかどうかhost>など
bab

@babは、単一のクエリまたは別のデータベースで動作するモデルを作成したいですか?
デビッドマナーズ

私は単一のクエリを作成していますが、可能であればモデルも使用します。実際には、調査サイトで作業しています。私はmagentoを介してこのサイトのデータベースにアクセスしたいと思います。同じことについて多くの記事を読みましたが、このコードをどこに置くべきかわかりません。
バブ

@bab 2番目のconfig.xmlの例は、モデルに対して機能するはずです。コードでエラーが発生しましたか?
デビッドマナーズ

3

これらの答えをすべて読んだ後、テストしていくつかのテストを行った後、このソリューションを見つけました。これは私が解決策を書いた私のブログです。

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つの更新を行うだけです

  1. 接続を変更するタイミングが$ reportConnectionであるかどうかを知るためのフラグを作成します。
  2. 関数_construct()を更新してカスタム接続を作成し、リソースの配列に追加します。
  3. 関数_getConnection()を更新して、カスタム接続を使用するかどうかを決定します。
//国旗
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();

1

モジュール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);
?>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.