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