как подключить другую базу из magento


17

Можно ли подключиться к другой базе данных из Magento и получить доступ к данным?

Если мне нужно создать модуль, как я могу создать модуль для доступа к другой базе данных? Есть ли учебник, который рассказывает об этом с нуля? Любая идея?

Ответы:


18

Первое, что вам нужно сделать, это создать соединение в файле config.xml вашего модуля. Это должно выглядеть примерно так же, как default_setupу вас /app/etc/local.xml. Здесь вы можете указать хост в качестве локального хоста, а затем установить другое имя базы данных или вы можете полностью указать другой хост. Я также использовал сокет, до которого тоже работает.

<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


извините, это не работает для меня.
Bab

Я не понимаю, где написать этот код, где выполнить запрос и что изменить в этом. Например, введите ли я <host> <! [CDATA [localhost]]> </ host> или <host> localhost </ ведущий> и т. д.
малыш

@bab Вы хотите сделать один запрос или модель, которая работает с другой базой данных?
Дэвид Мэннерс

Я делаю один запрос, но по возможности через модель. На самом деле, я работаю на сайте опроса. Я хочу получить доступ к базе данных этого сайта через magento. Я прочитал очень много статей для этого, но я не знаю, где разместить этот код. Если возможно, скажите, пожалуйста, какие изменения я могу внести в вашу кодировку, чтобы получить желаемый результат. Спасибо.
малыш

@bab второй пример 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');
    $ Это -> _ ресурсо-> GetConnection ( 'test_read');
}

/ **
* Установите соединение, если установлен флаг
* /
защищенная функция _getConnection ($ connectionName) {
 if (isset ($ this -> _ connections [$ connectionName])) {
   вернуть $ 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);
  }
   }
   вернуть $ this -> _ connections [$ connectionName];
}

Последний шаг - вызвать коллекцию Order, но используя соединение 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);
?>
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.