Як використовувати декілька баз даних у Laravel


225

Я хочу об'єднати кілька баз даних у своїй системі. Більшу частину часу база даних займає MySQL; але він може відрізнятися в майбутньому, тобто адміністратор може створювати такі звіти, які є джерелом використання гетерогенної системи баз даних.

Отже, моє запитання: чи забезпечує Laravel який-небудь фасад для вирішення таких ситуацій? Або будь-яка інша основа має більш підходящі можливості для проблеми?

Відповіді:


471

Використання .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 і пароль_бази_данний таке ж, то ви можете використовувати , env('DB_USERNAME')який metioned в .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;
    }

}

Примітка. Будьте уважні до спроб встановлення зв’язків із таблицями в базі даних! Це можливо зробити, але це може бути з деякими застереженнями і залежить від того, які у вас є налаштування бази даних та / або бази даних.


З Документів Ларавеля

Використання декількох підключень до бази даних

Під час використання декількох з'єднань ви можете отримати доступ до кожного 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

1
Ви можете використовувати, class SomeModel extends Model { а також переконайтесь, що ви видалили значення з файлу env, як env('DB_DATABASE', 'name')під час створення нового масиву конфігурації БД у файлі database.php, як згадував
@sba

1
Привіт, я використовую Lumen і для частини конфігурації бази даних, у мене є лише файл ".env". Не database.php. То як я можу це виправити?
Chanaka De Silva

1
@ChanakaDeSilva Ви просто створите папку конфігурації та файл database.php у ній для Lumen. Мабуть, Lumen постійно перевіряє, чи існує цей файл, і використовуватиме його, якщо він є.
Екстерс

2
Дякую брате, я думаю, я зараз
binar

1
@ AbdullaNilam some1 прийшов до мене, щоб зробити програму multidb спочатку подумав, чи я не знаю, чи можливо це зараз, я знаю його просте; p
бінар

12

У Laravel 5.1 ви вказуєте з'єднання:

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

За замовчуванням Laravel використовує з'єднання за замовчуванням. Це просто, чи не так?

Детальніше читайте тут: http://laravel.com/docs/5.1/database#accessing-connections


у Laravel 5.1, що з красномовним?
Сімо

1
@simo, див. відповідь Абдулли.
schellingerht

Я написав повну статтю для сам, яку ви можете перевірити на <a href=" stackcoder.in/posts/… 7.x Кілька підключень до бази даних, міграції, стосунки та
запити</a>

6

Насправді, DB::connection('name')->select(..)для мене це не працює, тому що "ім'я" повинно бути в подвійних лапках: "ім'я"

Проте запит вибору виконується на моєму з'єднанні за замовчуванням. Ще намагаюся розібратися, як переконати Ларавеля працювати так, як це було призначено: змінити зв’язок.

Редагувати: я зрозумів це. Після налагодження Laravels DatabaseManager виявилося, що мій database.php (конфігураційний файл) (всередині $ this-> додаток) був невірним. У розділі "з'єднання" у мене були речі типу "база даних" зі значеннями того, з якого я скопіював. Чітко, замість

env('DB_DATABASE', 'name')

Мені потрібно було розмістити щось на кшталт

'myNewName'

оскільки всі з'єднання були перераховані з однаковими значеннями для бази даних, імені користувача, пароля тощо, що, звичайно, мало сенсу, якщо я хочу отримати доступ хоча б до іншого імені бази даних

Тому кожен раз, коли я хотів вибрати щось із іншої бази даних, я завжди опинявся у своїй базі даних за замовчуванням


1
Дякую! Ти врятував мій розум. Я намагався з’ясувати, чому всі мої запити стосуються бази даних за замовчуванням. Потім я прочитав вашу публікацію і зрозумів, що env завжди повертав значення .env, а другий параметр був просто резервним вмістом, який Laravel не використовував.
Моха

Поза темою: було б чудово, якби адміністратори не маніпулювали моїми повідомленнями. Або хоча б напишіть мені приватне повідомлення, що і чому вони хочуть змінити. Я не зрозумів, як надсилати приватні повідомлення.
sba

У мене була подібна проблема, я змінив значення, але не ключ. Він працював так: 'database' => env ('DB_NEW_DATABASE', 'myNewDatabase'). Добре помічено!
Фелліпе Санчес

0

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

Ви можете розширити ці моделі, щоб створити більше моделей для таблиць у кожній БД.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.