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

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

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

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

<?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():

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

Query

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

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

Eloquent модели

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

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

<?php

class SomeModel extends Eloquent {

    protected $connection = 'mysql2';

}

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

<?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
Как в таком случае разделять модели если в разных базах имеются таблицы с одинаковыми именами?