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

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

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

Ответ 1

Использование .env > = 5.0 (протестировано на 5.5)

В .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.

Без .env <5.0

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

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;
    }

}

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


Из Laravel Docs

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

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

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

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

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

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

  1. Laravel 5 множественное соединение с базой данных от laracasts.com
  2. Соедините несколько баз данных в laravel ОТ tutsnare.com
  3. Несколько соединений с БД в 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';

Вы можете расширить эти модели, чтобы создать больше моделей для таблиц в каждой БД.