При разработке CRM системы, довольно часто, основной сайт компании, лежит где-то рядом. И обычно использует другую базу данных. Распространенная задача - выдернуть какие-то данные из этой базы внутри CRM, используя модели. Как это сделать? Как использовать 2 или более подключения для ActiveRecord в Laravel

Этот пост о том как использовать несколько баз данных, а не про балансировку нагрузки или менеджер переключений между базами

Определяем подключения

Внутри вашего конфигурационного файла - обычно это app/config/database.php - вы можете определить более чем одно подключение любого типа. Любое количество подключений. По умолчанию вы там увидите подключения к sqllite, mssql, mysql и postgresql. Для примера - пусть наше приложение использует две базы mysql:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?php
return array(
 
    'default' => 'mysql',
 
    'connections' => array(
 
        # основная БД к которой будут подключаться модели по умолчанию
        'mysql' => array(
            'driver'    => 'mysql',
            'host'      => 'host1',
            'database'  => 'database1',
            'username'  => 'user1',
            'password'  => 'pass1'
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
        ),
 
        # второе подключение
        'mysql2' => array(
            'driver'    => 'mysql',
            'host'      => 'host2',
            'database'  => 'database2',
            'username'  => 'user2',
            'password'  => 'pass2'
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
        ),
    ),
);

Как вы можете видеть, по умолчанию будет использовано соединение mysql.

Указываем какое соединение использовать

Сейчас мы имеем два подключения к разным базам данных - как их использовать в коде?

Это можно сделать несколькими способами

Схема

В рамках Schema Builder, вы можете использовать Schema facade с любым подключением. Для указания, какое подключение использовать, просто запустите метода connection():

1
2
3
4
Schema::connection('mysql2')->create('some_table', function($table)
{
    $table->increments('id'):
});

Query

Подобно Schema Builder, вы можете определять соединение в Query Builder:

1
$users = DB::connection('mysql2')->select(...);

Eloquent модели

Также вы можете определять какое соединение  использовать в Eloquent моделях!

Первый способ - это явно указать его в поле $connection модели:

1
2
3
4
5
6
7
<?php
 
class SomeModel extends Eloquent {
 
    protected $connection = 'mysql2';
 
}

Также вы можете воспользоваться методом setConnection.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
 
class SomeController extends BaseController {
 
    public function someMethod()
    {
        $someModel = new SomeModel;
 
        $someModel->setConnection('mysql2');
 
        $something = $someModel->find(1);
 
        return $something;
    }
 
}

Будьте осторожны при попытке построить отношения между моделями использующими разные подключения. Это может работать не корректно и сильно зависит от того какие настройки и доступы имеют конкретные базы и пользователи баз.

Оставлять комментарии могут только зарегистрированные пользователи

Комментарии  

StaDeLeon
# StaDeLeon 19.02.2020 16:53
Как в таком случае разделять модели если в разных базах имеются таблицы с одинаковыми именами?