CakePHP 3 - 使用多个数据库连接*不使用ORM *
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CakePHP 3 - 使用多个数据库连接*不使用ORM *相关的知识,希望对你有一定的参考价值。
我有一个Cakephp 3.4.6 Web应用程序。由于它使用遗留(不是在Cake惯例中编写)数据库表,我们选择手动编写所有SQL查询,而不是尝试设置Table
和Entity
类。我意识到有些人会不同意这一点,但这不是问题的重点。
我有3个数据库:app_db
,users_db
,extra_db
。
我在config/app.php
中为每个配置了连接,这样:
'Datasources' => [
'default' => [], // 'app_db' credentials
'users_db' => [], // 'users_db' credentials
'extra_db' => [], // 'extra_db' credentials
];
我有一个位于src/Model/MyModel.php
的自定义模型文件。用于在其中一个数据库(app_db
)上执行查询的示例如下所示:
namespace App\Model;
use Cake\Datasource\ConnectionManager;
class MyModel
{
protected $connection;
public function __construct()
{
$this->connection = ConnectionManager::get('default');
}
public function getData()
{
$sql = ''; // some SQL query
$stmt = $this->connection->prepare($sql);
$stmt->execute();
return $stmt->fetchAll('assoc');
}
}
这是有效的,因为它获得了映射到default
的app_db
的连接。
但是,我现在想要运行一个查询,该查询需要从app_db
和JOIN获取来自users_db
的数据。
如何在模型中配置它以便SQL与其他数据库通信?
答案
简单的方法是,有另一种方法,它将改变连接。
public function switchConnection($connection=''){
$this->connection = ConnectionManager::get(connection);
}
结束调用它来改变连接
MyModel->switchConnection('app_db');
下次运行getData时,它将与app_db通信而不是默认通信。
以上是关于CakePHP 3 - 使用多个数据库连接*不使用ORM *的主要内容,如果未能解决你的问题,请参考以下文章