Wie kann ich meine Sammlung dazu bringen, eine andere DB -Verbindung zu verwenden?
-
16-10-2019 - |
Frage
Deshalb habe ich eine Magento -Sammlung erweitert, um meine eigene Sammlung zu erhalten, nur ich möchte eine andere DB -Verbindung verwenden. Ich habe versucht zu definieren, die Verbindung in config.xml Like SO:
<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>
Und dann in meinem überragenden Konstruktor:
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);
}
.....
}
Dies scheint keinen Effekt zu haben. Ich hätte einen Fehler erwartet, wenn es nicht funktioniert hätte. Was kann ich tun?
UPDATE: Nach mehr Debugging stelle ich fest, dass dieser Code unten die ursprüngliche DB -Verbindung zurückgibt und nicht die in meinem XML definierten. Warum ist das so?
$conn = $resource->getConnection('externaldb_read');
Lösung
Eine schnelle Überprüfung (siehe Testkoffer unten) zeigt tatsächlich, was Sie tun, sollte nur pfirsichfarben sein.
Aus diesem Grund vermute ich einen Fehler in Ihrer Konfiguration. Bitte bearbeiten Sie Ihren Beitrag, um Ihre Sammelklasse mit zumindest in den Kollektion einzuschließen __construct
und _construct
Methoden.
Auch wenn Sie die nicht verwenden sales/order
Ressourcenmodell, bitte geben Sie es auch mit den Konstruktormethoden ein.
AKTUALISIEREN:
Ich habe gerade bemerkt, dass Sie es verwenden $resource->getConnection('reportingdb_read');
in Ihrem Konstruktor.
In der Konfiguration XML wird die Verbindung aufgerufen <externaldb_read>
.
Notiz: reportingdb_read
!= externaldb_read
Vielleicht ist das nur ein Kopier- und Einfügenfehler in Ihrem Beitrag, aber wenn nicht, müssen Sie verwenden
$resource->getConnection('externaldb_read');
Wenn dies nicht das Problem ist, aktualisieren Sie Ihren Beitrag noch einmal und ich werde helfen, weiter zu graben.
// 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();
}
}