CakePHP 3 - 使用多个数据库连接*不使用ORM *

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CakePHP 3 - 使用多个数据库连接*不使用ORM *相关的知识,希望对你有一定的参考价值。

我有一个Cakephp 3.4.6 Web应用程序。由于它使用遗留(不是在Cake惯例中编写)数据库表,我们选择手动编写所有SQL查询,而不是尝试设置TableEntity类。我意识到有些人会不同意这一点,但这不是问题的重点。

我有3个数据库:app_dbusers_dbextra_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');
    }
}

这是有效的,因为它获得了映射到defaultapp_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 *的主要内容,如果未能解决你的问题,请参考以下文章

CakePHP 3 连接表关联

CakePHP 3.0 连接数据库失败

如何在 CakePHP 控制器中使用多个模型

Cakephp 3:使用save()一次更新多个列

CakePHP 2.1 - 保存(和创建)多个连接模型和关联模型

Cakephp 3 - 使用_joinData属于ToMany