Я хочу объединить несколько баз данных в моей системе. В большинстве случаев база данных 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; } }
Примечание. Будьте внимательны при попытке построить отношения с таблицами через базы данных! Это можно сделать, но это может быть связано с некоторыми оговорками и зависит от того, какие базы данных и / или параметры базы данных у вас есть.
Использование нескольких соединений с базами данных
При использовании нескольких соединений вы можете получить доступ к каждому 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
первых нескольких строках.
Схема, «Красноречивый» и «Запрос» будут такими же, как указано выше
Полезные ссылки
laracasts.com
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'
поскольку все соединения, в которых указаны те же значения для базы данных, имени пользователя, пароля и т. д., что, конечно, имеет мало смысла, если я хочу получить доступ, по крайней мере, к другому имени базы данных
Поэтому каждый раз, когда я хотел выбрать что-то из другой базы данных, я всегда попадал в свою базу данных по умолчанию