Как использовать несколько баз данных в Laravel

Я хочу объединить несколько баз данных в моей системе. В большинстве случаев база данных MySQL; но он может отличаться в будущем, то есть администратор может создавать такие отчеты, которые используют источник гетерогенной системы баз данных.

Итак, мой вопрос заключается в том, делает ли Laravel любой Фасад, чтобы справляться с такими ситуациями? Или любая другая структура имеет более подходящие возможности для решения проблемы?

Определить соединения

app/config/database.php

 return array( 'default' => 'mysql', 'connections' => array( # Primary/Default database connection 'mysql' => array( 'driver' => 'mysql', 'host' => 'host1', 'database' => 'database1', 'username' => 'user1', 'password' => 'pass1' 'charset' => 'utf8', 'collation' => 'utf8_unicode_ci', 'prefix' => '', ), # Secondary database connection 'mysql2' => array( 'driver' => 'mysql', 'host' => 'host2', 'database' => 'database2', 'username' => 'user2', 'password' => 'pass2' 'charset' => 'utf8', 'collation' => 'utf8_unicode_ci', 'prefix' => '', ), ), ); 

схема

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

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

запрос

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

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

красноречивый

Вы также можете определить, какое соединение использовать в ваших моделях 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; } } 

Примечание. Будьте внимательны при попытке построить отношения с таблицами через базы данных! Это можно сделать, но это может быть связано с некоторыми оговорками и зависит от того, какие базы данных и / или параметры базы данных у вас есть.


От Laravel Docs

Использование нескольких соединений с базами данных

При использовании нескольких соединений вы можете получить доступ к каждому connection помощью метода соединения на DB . name переданное методу connection должно соответствовать одному из соединений, перечисленных в конфигурационном файле config/database.php :

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

Вы также можете получить доступ к необработанному базовому экземпляру PDO, используя метод getPdo в экземпляре подключения:

 $pdo = DB::connection()->getPdo(); 

Использование .env 5.5 (EDIT – 2017-10-22)

В .env

 DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=homestead DB_USERNAME=homestead DB_PASSWORD=secret DB_CONNECTION_SECOND=mysql DB_HOST_SECOND=127.0.0.1 DB_PORT_SECOND=3306 DB_DATABASE_SECOND=homestead2 DB_USERNAME_SECOND=homestead DB_PASSWORD_SECOND=secret 

В config/database.php

 'mysql' => [ 'driver' => env('DB_CONNECTION'), 'host' => env('DB_HOST'), 'port' => env('DB_PORT'), 'database' => env('DB_DATABASE'), 'username' => env('DB_USERNAME'), 'password' => env('DB_PASSWORD'), ], 'mysql2' => [ 'driver' => env('DB_CONNECTION_SECOND'), 'host' => env('DB_HOST_SECOND'), 'port' => env('DB_PORT_SECOND'), 'database' => env('DB_DATABASE_SECOND'), 'username' => env('DB_USERNAME_SECOND'), 'password' => env('DB_PASSWORD_SECOND'), ], 

Примечание. В mysql2 если DB_username и DB_password одинаковы, вы можете использовать env('DB_USERNAME') который измеряется в .env первых нескольких строках.

Схема, «Красноречивый» и «Запрос» будут такими же, как указано выше


Полезные ссылки

  1. Источник
  2. Laravel 5 соединение с несколькими базами данных от laracasts.com
  3. Подключение нескольких баз данных в laravel FROM tutsnare.com

В Laravel 5.1 вы указываете соединение:

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

По умолчанию Laravel использует соединение по умолчанию. Это просто, не так ли?

Подробнее здесь: http://laravel.com/docs/5.1/database#accessing-connections

На самом деле, DB :: connection ('name') -> select (..) не работает для меня, потому что «имя» должно быть в двойных кавычках: «name»

Тем не менее запрос выбора выполняется по умолчанию. Все еще пытаясь понять, как убедить Ларавела работать так, как он предназначен: изменить соединение.

Редактировать: я понял это. После отладки Laravels DatabaseManager оказалось, что мой database.php (файл конфигурации) (внутри $ this-> app) был неправильным. В разделе «Соединения» у меня были такие вещи, как «база данных» со значениями, которые я копировал. В ясных выражениях вместо

env ('DB_DATABASE', 'name')

мне нужно было поместить что-то вроде

'MyNewName'

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

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