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');

당신이 모델을 통해이 작업을 수행 할 경우, 당신은을 지정할 수 있습니다 read, write그리고 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>

모델 자체는 function에서 연결 정보를 찾으려고 시도합니다 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


죄송합니다. 저에게는 효과가 없습니다.
bab

이 코드를 작성하는 위치, 쿼리를 수행 할 위치 및이 항목의 변경 내용을 이해할 수 없습니다. 예를 들어 <host> <! [CDATA [localhost]]> </ host> 또는 <host> localhost </ host> etc.
bab

@ bab 다른 데이터베이스에서 작동하는 단일 쿼리 또는 모델을 만들고 싶습니까?
David Manners

나는 단일 쿼리를 만들고 있지만 가능하면 모델을 통해 가능합니다. 실제로 나는 설문 조사 사이트에서 일하고 있습니다. magento를 통해이 사이트의 데이터베이스에 액세스하고 싶습니다. 동일한 기사를 많이 읽었지만이 코드를 어디에 두어야할지 모르겠습니다. 가능한 경우 원하는 결과를 얻기 위해 코딩에서 변경할 수있는 부분을 알려주십시오. 감사합니다.
bab

@bab 두 번째 config.xml 예제는 모델에서 작동합니다. 코드에 오류가 있습니까?
David Manners

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 resource Mage / Sales / Model / Resource / Order.php를 재정의 한 후 3 번 업데이트하십시오.

  1. 연결 $ reportConnection을 변경할 시간을 알리는 플래그를 작성하십시오.
  2. _construct () 함수를 업데이트하여 사용자 정의 연결을 작성하고이를 자원 배열에 추가하십시오.
  3. _getConnection () 함수를 업데이트하여 사용자 정의 연결 사용 여부를 결정하십시오.
//깃발
공개 $ reportConnection = 거짓;

/ **
* local.xml 'test_read'에 정의 된 연결 만 추가하십시오.
* /
보호 된 함수 _construct () {
    $ this-> _ init ( '판매 / 주문', 'entity_id');
    $ this-> _ resources-> getConnection ( 'test_read');
}

/ **
* 플래그가 설정된 경우 연결합니다
* /
보호 된 기능 _getConnection ($ connectionName) {
 if (isset ($ this-> _ connections [$ connectionName])) {
   return $ this-> _ connections [$ connectionName];
    }

   if ($ connectionName == '읽기'&& $ this-> reportConnection)
        $ this-> _ connections [$ connectionName] = $ this-> _ resources-> getConnection ( 'test_read');
   그밖에{
   if (! empty ($ this-> _ resourcePrefix)) {
      $ this-> _ connections [$ connectionName] = $ this-> _ resources-> getConnection (
      $ this-> _ resourcePrefix '_'. $ connectionName);
  } else {
   $ this-> _ connections [$ connectionName] = $ this-> _ resources-> getConnection ($ connectionName);
  }
   }
   return $ this-> _ connections [$ connectionName];
}

마지막 단계는 주문 콜렉션을 호출하지만 test_read 연결을 사용하는 것입니다.

//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.