В моем коде у меня есть две базы данных 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 и создавать новые объекты, которые подключаются к различным базам данных в модели. Это нецелесообразно, но если это то, что вы хотите сделать, сделайте это.
Также посмотрите на это:
Как подключить несколько баз данных в фальконе