コレクションに別のDB接続を使用するにはどうすればよいですか?
-
16-10-2019 - |
質問
それで、私は自分のコレクションを取得するためにMagentoコレクションを拡張しました。別のDB接続を使用したいだけです。私がやろうとしたことは、の接続を定義することです 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);
}
.....
}
これには効果がないようです。うまくいかなければ、エラーが予想されていたでしょう。私は何をしますか?
更新:さらにデバッグした後、以下のこのコードは、XMLで定義したものではなく、元のDB接続を返すことに注意してください。何故ですか?
$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();
}
}