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