CakePHP 3 多数据库

5
我希望使用CakePHP 3连接到第二个(远程)数据库。我在网上找到了一些解决方案,它们建议如何将不同的模型与不同的数据库关联起来,但这不是我需要实现的目标。
我需要能够连接到一个远程数据库(没有与任何模型相关联),并从我的控制器中的操作读取/写入一些记录。这是否可以使用CakePHP实现?
编辑(更多信息):
我有一个网站,作为酒店客房预订平台。这些房间的可用性可以通过我的网站进行控制,并存储在我的数据库中。但对于一些客户,我希望能够直接连接到他们的私人数据库,并使用他们的记录来检查可用性。

如果您需要在数据库中编写表格,最好为其创建一个模型...我不理解"与任何模型无关的那部分"。它可能不是您的主要数据结构的一部分,但它仍然是结构化数据。 - JvO
@JvO 感谢您的回复!这是我的问题。我有一个网站,作为酒店客房预订平台。这些客房的可用性可以通过网站进行控制并存储在我的数据库中。但是对于一些客户,我希望能够直接连接到他们的私人数据库,并使用他们的记录来检查可用性。我需要为每个客户创建自定义模型吗? - Cellydy
这些客户端没有提供你可以访问的API吗?为什么要直接查询数据库?只是好奇。 - yBrodsky
那么,或者每种预订软件至少有一个模型(我希望至少有一些客户使用相同的软件包)。这也是必要的,因为我假设在系统之间精确查询会有很大的差异。 - JvO
显示剩余2条评论
1个回答

9

按照以下说明进行操作

步骤 1:打开 config/app.php,找到 Datasources 数组,并像下面一样添加 远程数据库 配置 -

'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:现在您可以像这样在控制器中访问 远程数据库 -

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
    }
}

2
太棒了!正是我想要的。谢谢! - Cellydy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接