Как заставить мою коллекцию использовать другое соединение БД?
-
16-10-2019 - |
Вопрос
Поэтому я расширил коллекцию 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();
}
}