Подтвердить что ты не робот

Несколько соединений с базой данных в cakephp 3

Я пытаюсь подключиться к нескольким базам данных в cakephp 3. Я пробовал много раз, но все вопросы и ответы находятся в cakephp 2. Я нашел Конфигурирование подключений в документации cakephp 3. Но я не могу этого понять.

У меня есть две базы данных:

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

Работа с базой данных tracking_system полностью запущена. Но я не знаю, как подключиться к нескольким базам данных (в моем случае со второй базой данных tracking_system2).

Заранее благодарим за помощь.

4b9b3361

Ответ 1

Вы можете объявить метод defaultConnectionName() в таблицах, которые будут использовать по умолчанию другое соединение. В любом из ваших классов Table:

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

Ответ 2

Я получаю решение своей проблемы. И он работает хорошо. Пожалуйста, обратитесь к приведенному ниже коду и прокомментируйте, если я ошибаюсь в любом месте.

- > 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
  • добавьте эту строку в контроллер.

использовать Cake\Datasource\ConnectionManager;

my Код TodolistsController.php:

<?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');
    }
}

Что это.

Спасибо...

Ответ 3

Чтобы переключить базу данных для модели,

Используйте пространство имен в контроллере/модели

use Cake\Datasource\ConnectionManager;

В контроллере; -

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

В модели: -

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

Примечание. - Если вы также сохраняете данные для связанных таблиц, в виду изменения БД для соответствующих данных, в противном случае данные для связанная таблица будет вставлена ​​в соединение по умолчанию /DB.

Это ответ для CakePHP 3. *

Ответ 4

Вы можете попробовать с использованием свойства modelDbConfig, если он работает для вас.

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