Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Multiple database connection in cakephp 3

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.

like image 346
Jigar Dhaduk Avatar asked May 01 '15 05:05

Jigar Dhaduk


People also ask

How does CakePHP connect to multiple databases?

Just open your database. php file inside config folder and search this class "DATABASE_CONFIG". Here you can add multiple database configuration. The default database is "public $default" , if you want to use database2 you have to initialize "public $test 1" in your Model.

How can I print query in CakePHP 2?

Add below code in app_model. php file which is located at root/cake/libs/model. Add below line in your model where you want print query. $last_query = $ this ->ModelName->getLastQuery();


2 Answers

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';
}
like image 129
José Lorenzo Rodríguez Avatar answered Sep 23 '22 06:09

José Lorenzo Rodríguez


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

like image 31
Jigar Dhaduk Avatar answered Sep 22 '22 06:09

Jigar Dhaduk