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

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

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


person Chintan7027    schedule 06.08.2015    source источник


Ответы (6)


Использование .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'):
});

Конструктор запросов

$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

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

При использовании нескольких подключений вы можете получить доступ к каждому 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
person Abdulla Nilam    schedule 06.08.2015
comment
Привет, я попробовал это решение, но даже при отсутствии сообщений об ошибках таблица все еще создается в базе данных, указанной в соединении mysql, а не mysql2. Что я могу попробовать дальше? :( - person Pedro Araujo Jorge; 15.07.2016
comment
Вы можете использовать class SomeModel extends Model { , а также убедитесь, что вы удалили значения get из файла env как env('DB_DATABASE', 'name') при создании нового массива конфигурации БД в файле database.php, как упомянул @sba - person Sadee; 23.04.2017
comment
Эй, я использую Lumen, а для части конфигурации базы данных у меня есть только файл .env. Не database.php. Так как я могу это исправить? - person Chanaka De Silva; 26.06.2017
comment
@ChanakaDeSilva Вы просто создаете папку конфигурации и файл database.php в ней для Lumen. Очевидно, Lumen постоянно проверяет, существует ли этот файл, и будет использовать его, если он есть. - person Ecksters; 26.03.2018
comment
Спасибо, братан, я думаю, что беру эту работу сейчас; p - person binar; 07.08.2018
comment
@AbdullaNilam some1 пришел ко мне, чтобы сделать приложение multidb. Сначала я подумал, что я не знаю, возможно ли это, теперь я знаю, что это просто; p - person binar; 09.08.2018
comment
что, если нам нужен первичный БД, а затем динамическое количество БД, например отдельные БД на каждый отчетный финансовый год - person M.Imran Mamda; 21.10.2019
comment
Вау .super. Спасибо, сэр. В моем случае $ users = DB :: connection ('mysql2') - ›select (...); это работает нормально, сэр - person Ganesan J; 22.06.2021

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

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

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

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

person schellingerht    schedule 06.08.2015
comment
в Laravel 5.1, а как насчет Eloquent? - person simo; 06.12.2015
comment
@simo, см. ответ Абдуллы. - person schellingerht; 07.12.2015
comment
Я написал полную статью для sam, вы можете проверить ее на ‹a href = stackcoder.in/posts/ 7.x Множественные подключения к базе данных, миграции, отношения и запросы ‹/a› - person Channaveer Hakari; 03.05.2020

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

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

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

env('DB_DATABASE', 'name')

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

'myNewName'

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

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

person sba    schedule 02.08.2016
comment
Спасибо! Ты спас мне рассудок. Я попытался выяснить, почему все мои запросы относятся к базе данных по умолчанию. Затем я прочитал ваш пост и понял, что env всегда возвращает значения .env, а второй параметр был просто запасным вариантом, который Laravel не использовал. - person Moha; 14.10.2016
comment
Не по теме: было бы здорово, если бы админы не манипулировали моими постами. Или хотя бы напишите мне в приват, что и почему хотят изменить. Я не понял, как отправлять личные сообщения. - person sba; 11.04.2018
comment
У меня была аналогичная проблема, я изменил значение, но не ключ. Это работало так: 'database' = ›env ('DB_NEW_DATABASE', 'myNewDatabase'). Хорошо замечено! - person Fellipe Sanches; 01.06.2020

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

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

person sumit    schedule 15.04.2019

Также вы можете использовать систему postgres fdw

https://www.postgresql.org/docs/9.5/postgres-fdw.html

Вы сможете подключать разные db в postgres. После этого в одном запросе можно получить доступ к таблицам, находящимся в разных базах данных.

person MTakumi    schedule 23.12.2020

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

Нам пришлось бы отредактировать сотни красноречивых вызовов, чтобы вставить DB :: connection ('foo')

person iteam    schedule 17.05.2021