Как использовать несколько баз данных в Laravel
Я хочу объединить несколько баз данных в моей системе. В большинстве случаев база данных MySQL; но он может отличаться в будущем, то есть администратор может генерировать такие отчеты, которые являются использовать источник гетерогенной системы.
Итак, мой вопрос: делает ли Laravel любой фасад для решения таких ситуаций? Или любая другая структура имеет более подходящие возможности для проблемы?
Ответы
Ответ 1
В .env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=database1
DB_USERNAME=root
DB_PASSWORD=secret
DB_CONNECTION_SECOND=mysql
DB_HOST_SECOND=127.0.0.1
DB_PORT_SECOND=3306
DB_DATABASE_SECOND=database2
DB_USERNAME_SECOND=root
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
.
Определить соединения
app/config/database.php
return array(
'default' => 'mysql',
'connections' => array(
# Primary/Default database connection
'mysql' => array(
'driver' => 'mysql',
'host' => '127.0.0.1',
'database' => 'database1',
'username' => 'root',
'password' => 'secret'
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
),
# Secondary database connection
'mysql2' => array(
'driver' => 'mysql',
'host' => '127.0.0.1',
'database' => 'database2',
'username' => 'root',
'password' => 'secret'
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
),
),
);
схема
Чтобы указать, какое соединение использовать, просто запустите метод connection()
Schema::connection('mysql2')->create('some_table', function($table)
{
$table->increments('id'):
});
Query Builder
$users = DB::connection('mysql2')->select(...);
красноречивый
Установите переменную $connection
в вашей модели
class SomeModel extends Eloquent {
protected $connection = 'mysql2';
}
Вы также можете определить соединение во время выполнения с помощью метода setConnection
или статического метода on
:
class SomeController extends BaseController {
public function someMethod()
{
$someModel = new SomeModel;
$someModel->setConnection('mysql2'); // non-static method
$something = $someModel->find(1);
$something = SomeModel::on('mysql2')->find(1); // static method
return $something;
}
}
Примечание. Будьте осторожны при попытке построить отношения с таблицами в разных базах данных! Это можно сделать, но это может сопровождаться некоторыми оговорками и зависит от того, какие настройки базы данных и/или базы данных у вас есть.
Использование нескольких подключений к базе данных
При использовании нескольких соединений вы можете получить доступ к каждому connection
через метод соединения на фасаде DB
. name
передаваемое методу connection
должно соответствовать одному из соединений, перечисленных в вашем файле конфигурации config/database.php
:
$users = DB::connection('foo')->select(...);
Вы также можете получить доступ к необработанному базовому экземпляру PDO, используя метод getPdo для экземпляра соединения:
$pdo = DB::connection()->getPdo();
Полезные ссылки
- Laravel 5 множественное соединение с базой данных от
laracasts.com
- Соедините несколько баз данных в laravel ОТ
tutsnare.com
- Несколько соединений с БД в Laravel ОТ
fideloper.com
Ответ 2
В Laravel 5.1 вы указываете соединение:
$users = DB::connection('foo')->select(...);
По умолчанию, Laravel использует соединение по умолчанию. Это просто, не так ли?
Подробнее здесь: http://laravel.com/docs/5.1/database#accessing-connections
Ответ 3
На самом деле, DB::connection('name')->select(..)
у меня не работает, потому что name должно быть в двойных кавычках: name
Тем не менее, запрос выбора выполняется на моем подключении по умолчанию. Все еще пытаюсь понять, как убедить Laravel работать так, как задумано: изменить соединение.
Редактировать: я понял это. После отладки Laravels DatabaseManager оказалось, что мой database.php (файл конфигурации) (внутри $this-> app) был неверным. В разделе "соединения" у меня были такие вещи, как "база данных" со значениями того, из которого я его скопировал. Ясно, вместо
env('DB_DATABASE', 'name')
Мне нужно было разместить что-то вроде
'myNewName'
поскольку все соединения были перечислены с одинаковыми значениями для базы данных, имени пользователя, пароля и т.д., что, конечно, не имеет большого смысла, если я хочу получить доступ по крайней мере к другому имени базы данных
Поэтому каждый раз, когда я хотел выбрать что-то из другой базы данных, я всегда попадал в базу данных по умолчанию
Ответ 4
Перейдите в config/database.php
чтобы создать новую конфигурацию соединения с базой данных. В данном случае это мои настройки
'connections' => [
'sqlite' => [
'driver' => 'sqlite',
'database' => env('DB_DATABASE', database_path('database.sqlite')),
'prefix' => '',
],
'mysql' => [
'driver' => 'mysql',
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'strict' => true,
'engine' => null,
],
'mysql2' => [
'driver' => 'mysql',
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE2', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'strict' => true,
'engine' => null,
],
'sqlsrv' => [
'driver' => 'sqlsrv',
'host' => env('DB_HOST_SQLSRV', 'localhost'),
'port' => env('DB_PORT_SQLSRV', '1433'),
'database' => env('DB_DATABASE_SQLSRV', 'forge'),
'username' => env('DB_USERNAME_SQLSRV', 'forge'),
'password' => env('DB_PASSWORD_SQLSRV', ''),
'charset' => 'utf8',
'prefix' => '',
],
Ответ 5
Laravel имеет встроенную поддержку для нескольких систем баз данных, вам необходимо предоставить подробную информацию о соединении в файле config/database.php
return [
'default' => env('DB_CONNECTION', 'mysql'),
'connections' => [
'mysql' => [
'driver' => 'mysql',
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
'strict' => false,
'engine' => null,
],
'mysqlOne' => [
'driver' => 'mysql',
'host' => env('DB_HOST_ONE', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE_ONE', 'forge'),
'username' => env('DB_USERNAME_ONE', 'forge'),
'password' => env('DB_PASSWORD_ONE', ''),
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
'strict' => false,
'engine' => null,
],
];
Получив это, вы можете создать два класса базовой модели для каждого соединения и определить имя соединения в этих моделях.
//BaseModel.php
protected $connection = 'mysql';
//BaseModelOne.php
protected $connection = 'mysqlOne';
Вы можете расширить эти модели, чтобы создать больше моделей для таблиц в каждой БД.