При разработке 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;
}
}
Будьте осторожны при попытке построить
отношениямежду моделями использующими разные подключения. Это может работать не корректно и сильно зависит от того какие настройки и доступы имеют конкретные базы и пользователи баз.


Комментарии