Как подключить несколько баз данных в инфраструктуре phalcon в то же время использовать как в классе модели не только один

В моем коде у меня есть две базы данных ABC и XYZ . Я хочу использовать обе базы данных в той же модели, что и решение для нее в phalcon? Как реализовать для этого несколько соединений с базой данных?

один

 <?php //This service returns a MySQL database $di->set('dbMysql', function() { return new \Phalcon\Db\Adapter\Pdo\Mysql(array( "host" => "localhost", "username" => "root", "password" => "secret", "dbname" => "invo" )); }); //This service returns a PostgreSQL database $di->set('dbPostgres', function() { return new \Phalcon\Db\Adapter\Pdo\PostgreSQL(array( "host" => "localhost", "username" => "postgres", "password" => "", "dbname" => "invo" )); }); 

два

 <?php class Robots extends \Phalcon\Mvc\Model { public function initialize() { $this->setConnectionService('dbPostgres'); } } 

три

 <?php class Robots extends \Phalcon\Mvc\Model { public function initialize() { $this->setReadConnectionService('dbSlave'); $this->setWriteConnectionService('dbMaster'); } } 

4

 class Robots extends Phalcon\Mvc\Model { /** * Dynamically selects a shard * * @param array $intermediate * @param array $bindParams * @param array $bindTypes */ public function selectReadConnection($intermediate, $bindParams, $bindTypes) { //Check if there is a 'where' clause in the select if (isset($intermediate['where'])) { $conditions = $intermediate['where']; //Choose the possible shard according to the conditions if ($conditions['left']['name'] == 'id') { $id = $conditions['right']['value']; if ($id > 0 && $id < 10000) { return $this->getDI()->get('dbShard1'); } if ($id > 10000) { return $this->getDI()->get('dbShard2'); } } } //Use a default shard return $this->getDI()->get('dbShard0'); } } 

5

 <?php $robot = Robots::findFirst('id = 101'); 

Вы не можете использовать оба подключения к базе данных в той же модели. Так:

 // Set the connection in the DI $di->set('database_slave', .....) $di->set('database_master', .....) 

В вашей модели вы можете делать только:

 public function initialize() { $this->setConnectionService('database_slave'); } 

или

 public function initialize() { $this->setConnectionService('database_master'); } 

Вы не можете использовать оба одновременно. Что вы можете сделать, чтобы ваши модели стали более гибкими, так это расширить базовую модель следующим образом:

 class MyModel extends \Phalcon\Mvc\Model { $connection = ''; public function initialize() { // Default to the master connection $connection = ($this->connection) ? $this->connection : 'database_master'; $this->setConnectionService($connection); parent::initialize() } public function setMyConnection($connection = 'database_master') { switch ($connection) { case 'database_master': case 'database_slave' $this->connection = $connection; break; default: $this->connection = 'database_master'; break; } } } 

и в вашем коде вы можете это сделать

 $mymodel = new MyModel(); $mymodel->setMyConnection('database_slave'); // do other stuff - this model will use the slave now. 

Если вы действительно хотите подключиться к двум базам данных из модели, вы можете использовать PHQL и создавать новые объекты, которые подключаются к различным базам данных в модели. Это нецелесообразно, но если это то, что вы хотите сделать, сделайте это.

Также посмотрите на это:

Как подключить несколько баз данных в фальконе