Как заставить мою коллекцию использовать другое соединение БД?

magento.stackexchange https://magento.stackexchange.com/questions/11224

Вопрос

Поэтому я расширил коллекцию Magento, чтобы получить свою собственную коллекцию, только я хочу использовать другое соединение БД. То, что я пытался сделать, это определить связь в config.xml вот так:

<global>
    <resources>
        <externaldb_write>
            <connection>
                <use>externaldb_database</use>
            </connection>
        </externaldb_write>
        <externaldb_read>
            <connection>
                <use>externaldb_database</use>
            </connection>
        </externaldb_read>
        <externaldb_setup>
            <connection>
                <use>core_setup</use>
            </connection>
        </externaldb_setup>
        <externaldb_database>
            <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>
        </externaldb_database>
    </resources>
</global>

А потом в моем главном конструкторе, сделайте:

class VMR_Customreports_Model_Resource_Storeoverview_Collection extends     Mage_Reports_Model_Resource_Order_Collection
{
        public function __construct()
        {
                parent::__construct();

                $resource = Mage::getSingleton('core/resource');
                $conn = $resource->getConnection('externaldb_read');

                $this->setConnection($conn);
        }
.....
}

Это, похоже, не имеет никакого эффекта. Я бы ожидал ошибки, если бы она не сработала. Что я делаю?

Обновление: после большей отладки я отмечаю, что этот код ниже возвращает исходное соединение DB, а не то, что я определил в своем XML. Почему это?

$conn = $resource->getConnection('externaldb_read');

Это было полезно?

Решение

Быстрая проверка (см. Тестовый пример ниже) показывает, что вы делаете, должна быть просто персиковым.
По этой причине я подозреваю некоторую ошибку в вашей конфигурации. Пожалуйста, отредактируйте свой пост, чтобы включить свой класс коллекций, по крайней мере, это __construct а также _construct методы
Кроме того, если вы не используете sales/order Модель ресурса, пожалуйста, также включите ее с помощью методов конструктора.

ОБНОВИТЬ:
Я только что заметил, что вы используете $resource->getConnection('reportingdb_read'); в вашем конструкторе.
В конфигурации XML подключение называется <externaldb_read>.
Примечание: reportingdb_read != externaldb_read

Может быть, это просто ошибка копирования и вставки в вашем посте, но если нет, вы должны использовать
$resource->getConnection('externaldb_read');
Если это не проблема, пожалуйста, обновите свой пост снова, и я помогу копаться дальше.


// Test to confirm a connection set via setConnection() on a 
// Mage_Reports_Model_Resource_Order_Collection instance is used
// to load the collection data.
class Reports_CollectionTest extends PHPUnit_Framework_TestCase
{
    public static function setUpBeforeClass()
    {
        require_once 'app/Mage.php';
        Mage::setIsDeveloperMode(true);
        Mage::app('admin');
    }

    protected function getConnectionMock()
    {
        $mockSelect = $this->getMockBuilder('Varien_Db_Select')
            ->disableOriginalConstructor()
            ->getMock();

        $mockConn = $this->getMockBuilder('Varien_Db_Adapter_Pdo_Mysql')
            ->disableOriginalConstructor()
            ->getMock();

        $mockConn->expects($this->once())
            ->method('select')
            ->will($this->returnValue($mockSelect));

        $mockConn->expects($this->once())
            ->method('fetchAll');

        return $mockConn;
    }

    /**
     * @test
     */
    public function testCollectionConnection()
    {
        $mockCon = $this->getConnectionMock();

        $collection = new Mage_Reports_Model_Resource_Order_Collection;
        $collection->setConnection($mockCon);

        $this->assertSame($mockCon, $collection->getConnection());
        $collection->load();
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с magento.stackexchange
scroll top