【问题标题】:CakePHP 3 Multiple DatabasesCakePHP 3 多个数据库
【发布时间】:2017-03-14 11:31:15
【问题描述】:

我想使用 CakePHP 3 连接到第二个(远程)数据库。我在网上找到了建议如何将不同模型与不同数据库相关联的解决方案,但这不是我需要实现的。

我需要能够连接到远程数据库(与任何模型无关)并从我的控制器中的操作中读取/写入一些记录。这可以使用 CakePHP 实现吗?

编辑(更多信息):

我有一个网站作为酒店客房预订平台。这些房间的可用性可以通过我的网站控制并存储在我的数据库中。但对于一些客户,我希望能够直接连接到他们的私有数据库并使用他们的记录来检查可用性。

【问题讨论】:

  • 如果您需要在数据库中写入表,您不妨为它创建一个模型......我不明白“与任何模型无关”部分。它可能不是您的主要数据结构的一部分,但它仍然是结构化数据。
  • @JvO 感谢您的回复!事情就是这样。我有一个网站作为酒店房间的预订平台。这些房间的可用性可以通过网站控制并存储在我的数据库中。但是对于某些客户,我希望能够直接连接到他们的私人数据库并使用他们的记录来检查可用性。我需要为每个客户创建一个自定义模型吗?
  • 这些客户端不提供您可以访问的api吗?为什么要直接查询数据库?只是好奇
  • 那个,或者每种订票软件至少一个型号(我希望有些客户至少使用同一个软件包)。这也是必要的,因为我假设确切的查询在系统之间会有很大差异。
  • @yBrodsky 不幸的是,他们没有,我也没有时间为我的每个客户创建一个独特的 API。因此直接连接。不理想,但我能想出的唯一解决方案。

标签: cakephp cakephp-3.0


【解决方案1】:

按照以下说明进行操作

第1步:打开config/app.php找到Datasources数组并添加Remote Database配置如-

'Datasources' => [
    'default' => [
        'className' => 'Cake\Database\Connection',
        'driver' => 'Cake\Database\Driver\Mysql',
        'persistent' => false,
        'host' => 'localhost',
        'port' => '3306',
        'username' => 'YOUR_DB_USER',
        'password' => 'YOUR_DB_PASS',
        'database' => 'YOUR_DB_NAME',
        'encoding' => 'utf8',
        'timezone' => 'UTC',
        'flags' => [],
        'cacheMetadata' => false,
        'log' => false,
        'quoteIdentifiers' => false,
        'url' => env('DATABASE_URL', null),
    ],
    'remote_db_1' => [ /*Remote Database 1*/
        'className' => 'Cake\Database\Connection',
        'driver' => 'Cake\Database\Driver\Mysql',
        'persistent' => false,
        'host' => '192.168.1.47', /*YOUR_REMOTE_SERVER_IP*/
        'port' => '3306',
        'username' => 'REMOTE_DB_USER',
        'password' => 'REMOTE_DB_PASS',
        'database' => 'REMOTE_DB_NAME',
        'encoding' => 'utf8',
        'timezone' => 'UTC',
        'flags' => [],
        'cacheMetadata' => false,
        'log' => false,
        'quoteIdentifiers' => false,
        'url' => env('DATABASE_URL', null),
    ],
   'remote_db_2' => [ /*Remote Database 2*/
        'className' => 'Cake\Database\Connection',
        'driver' => 'Cake\Database\Driver\Mysql',
        'persistent' => false,
        'host' => '192.168.1.47', /*YOUR_REMOTE_SERVER_IP*/
        'port' => '3306',
        'username' => 'REMOTE_DB_USER',
        'password' => 'REMOTE_DB_PASS',
        'database' => 'REMOTE_DB_NAME',
        'encoding' => 'utf8',
        'timezone' => 'UTC',
        'flags' => [],
        'cacheMetadata' => false,
        'log' => false,
        'quoteIdentifiers' => false,
        'url' => env('DATABASE_URL', null),
    ],

第 2 步:现在您可以在控制器中访问 Remote database,就像 as-

use Cake\Datasource\ConnectionManager;
use \PDO;

class YourController extends AppController{
    public function getRemoteData(){
      $conn1 = ConnectionManager::get('remote_db_1'); #Remote Database 1
      $conn2 = ConnectionManager::get('remote_db_2'); #Remote Database 2
    }
}

注意:现在您可以使用PDO 方法插入、检索、更新

示例:

class YourController extends AppController{
    public function getRemoteData(){
      $conn1 = ConnectionManager::get('remote_db_1'); #Remote Database 1
      $sql   = "SELECT * FROM  users";
      $query = $conn1->prepare($sql);
      $query->execute();
      $result = $query->fetchAll(); #Here is the result
    }
}

【讨论】:

  • 太棒了!正是我想要的。谢谢!
猜你喜欢
  • 2015-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多