Multiple database connection in cakephp 3

╄→尐↘猪︶ㄣ 提交于 2019-12-28 13:24:06

问题


I am trying to connect to multiple databases in cakephp 3. I have tried many times but all questions and answers are in cakephp 2. I found Configuring Connections at cakephp 3 documentation. But I can't understand it.

I have two databases :

1. tracking_system
     (Tables: trackers, events, etc..)
2. tracking_system_2
     (Tables: todos, actions, etc..)

Working with database tracking_system is completely running. But I don't know, how to connect to multiple databases (in my case, with second database tracking_system2).

Thanks in advance for help.


回答1:


You can declare the defaultConnectionName() method on the tables that will use by default another connection. In any of your Table classes:

public static function defaultConnectionName()  
{
    return 'another_config_name';
}



回答2:


I get a solution of my problem. And it's working good. Please refer the below code and comment if I am wrong at any place.

--> app.php

'Datasources' => [
'default' => [
    'className' => 'Cake\Database\Connection',
    'driver' => 'Cake\Database\Driver\Mysql',
    'persistent' => false,
    'host' => 'localhost',
    //'port' => 'nonstandard_port_number',
    'username' => 'your_username',
    'password' => 'your_password',
    'database' => 'tracking_system', // This is my default database
    'encoding' => 'utf8',
    'timezone' => 'UTC',
    'cacheMetadata' => true,
    'quoteIdentifiers' => false,
    //'init' => ['SET GLOBAL innodb_stats_on_metadata = 0'],
],

'db2' => [
    'className' => 'Cake\Database\Connection',
    'driver' => 'Cake\Database\Driver\Mysql',
    'persistent' => false,
    'host' => 'localhost',
    //'port' => 'nonstandard_port_number',
    'username' => 'your_username',
    'password' => 'your_password',
    'database' => 'tracking_system2', // This is my second database
    'encoding' => 'utf8',
    'timezone' => 'UTC',
    'cacheMetadata' => true,
    'quoteIdentifiers' => false,
    //'init' => ['SET GLOBAL innodb_stats_on_metadata = 0'],
 ]
]

--> TodolistsController.php

database name: tracking_system2

table name: todolists
  • add this line to your controller

use Cake\Datasource\ConnectionManager;

my TodolistsController.php code is:

<?php
namespace App\Controller;
use App\Controller\AppController;
use Cake\ORM\TableRegistry;
use Cake\ORM\Entity;
use Cake\Network\Exception\NotFoundException;
use Cake\Datasource\ConnectionManager; // This line is required

class TodolistsController extends AppController
{
public function todoadd(){
    $connection = ConnectionManager::get('db2'); // 'db2' where my second database is configured 
    $results = $connection->execute('SELECT * FROM todolists')->fetchAll('assoc');
    $this->set('results', $results);
    if($this->request->is('post')){
        $connection->insert('todolists', [
            'title' => $this->request->data['title'],
            'description' => $this->request->data['description']
        ]);
        $this->redirect($this->referer);
    }
}
}

--> TodolistsTable.php

<?php
namespace App\Model\Table;
use Cake\ORM\Table;

class TodolistsTable extends Table
{
    public static function defaultConnectionName()
    {
        return 'db2';
    }
    public function initialize(array $config)
    {
        $this->addBehavior('Timestamp');
    }
}

That's it.

Thank You...




回答3:


To switch the database for the model,

Use the namespace in the controller/model

use Cake\Datasource\ConnectionManager;

In controller;-

$conn = ConnectionManager::get('remote_db_1');
$this->ModelName->connection($conn);

In model:-

$conn = ConnectionManager::get('remote_db_1');
$this->connection($conn);

Note:- If you are saving data for the associated tables too, then keep in mind to change the DB for the associated data otherwise data for the associated table will be inserted into the default connection/DB.

This is the answer for CakePHP 3.*




回答4:


You can have a try with useDbConfig model property if it works for you.

class Example extends AppModel {
    public $useDbConfig = 'default1DbConfigSettings'; //The useDbConfig property is defaulted to the ‘default’ database connection.
}


来源:https://stackoverflow.com/questions/29981890/multiple-database-connection-in-cakephp-3

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!