Jak korzystać z wielu baz danych w Laravel

Chcę połączyć wiele baz danych w moim systemie. Najczęściej bazą danych jest MySQL, ale w przyszłości może się ona różnić, np. Admin Może generować takie raporty, które są źródłem heterogenicznego systemu bazodanowego.

Więc moje pytanie brzmi Czy Laravel zapewnia jakąś fasadę do radzenia sobie z takimi sytuacjami? Lub jakikolwiek inny framework ma bardziej odpowiednie możliwości dla problemu?

Author: Jan Żankowski, 2015-08-06

5 answers

Za pomocą .env >= 5.0 (testowane na 5.5)

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

W 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'),
],

Uwaga: W mysql2 jeśli DB_username i DB_password są takie same, możesz użyć env('DB_USERNAME'), który jest metalizowany w .env pierwszych kilku liniach.

Bez .env

Definiowanie Połączeń

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'    => '',
        ),
    ),
);

Schemat

Aby określić, którego połączenia użyć, po prostu uruchom metodę connection()

Schema::connection('mysql2')->create('some_table', function($table)
{
    $table->increments('id'):
});

Konstruktor Zapytań

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

Wymowne

Ustaw zmienną $connection w swoim modelu

class SomeModel extends Eloquent {

    protected $connection = 'mysql2';

}

Można również zdefiniować połączenie w trybie runtime za pomocą metody setConnection lub metody statycznej 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;
    }

}

Uwaga uważaj na próby budowania relacje z tabelami w bazach danych! Jest to możliwe, ale może pochodzić z pewnymi zastrzeżeniami i zależy od tego, jaką bazę danych i/lub ustawienia bazy danych masz.


Z Laravel Docs

Korzystanie Z Wielu Połączeń Baz Danych

Podczas korzystania z wielu połączeń, można uzyskać dostęp do każdego connection poprzez metodę podłączenia na DB fasada. Na name przekazane do connection metoda powinna odpowiadają jednemu z połączeń wymienionych w Twoim config/database.php plik konfiguracyjny:

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

Można również uzyskać dostęp do surowej, podstawowej instancji PDO za pomocą metody getPdo na instancji połączenia:

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

Przydatne Linki

  1. Laravel 5 multiple database connection FROM laracasts.com
  2. Połącz wiele baz danych w laravel z tutsnare.com
  3. wiele połączeń DB W Laravel z fideloper.com
 537
Author: Abdulla Nilam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-14 22:37:54

W Laravel 5.1 podajesz połączenie:

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

Domyślnie, Laravel używa domyślnego połączenia. To proste, prawda?

Czytaj więcej tutaj: http://laravel.com/docs/5.1/database#accessing-connections

 14
Author: schellingerht,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-06 04:56:24

Właściwie, DB::connection('name')->select(..) nie działa dla mnie, ponieważ 'nazwa' musi być w podwójnych cudzysłowach:"nazwa"

Mimo to zapytanie select jest wykonywane na moim domyślnym połączeniu. Wciąż próbuję dowiedzieć się, jak przekonać Laravela do działania zgodnie z jego przeznaczeniem: zmienić połączenie.

Edit: rozgryzłem to. Po debugowaniu Laravels DatabaseManager okazało się, że moja baza danych.php (plik konfiguracyjny) (w $this->app) się pomylił. W dziale "połączenia" miałem takie rzeczy jak "baza danych" z wartościami ten, z którego go skopiowałem. W jasnych słowach, zamiast

env('DB_DATABASE', 'name')

I needed to place something like

'myNewName'

Ponieważ wszystkie połączenia były wymienione z tymi samymi wartościami dla bazy danych, nazwy użytkownika, hasła itp. co oczywiście nie ma sensu, jeśli chcę uzyskać dostęp do przynajmniej innej nazwy bazy danych

Dlatego za każdym razem, gdy chciałem wybrać coś z innej bazy danych, zawsze kończyłem w domyślnej bazie danych

 6
Author: sba,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-10 07:46:29

Laravel posiada wbudowaną obsługę wielu systemów bazodanowych, szczegóły połączenia należy podać w config/database.php Plik

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,
        ],
];

Gdy już to masz, możesz utworzyć dwie klasy modelu bazowego dla każdego połączenia i zdefiniować nazwę połączenia w tych modelach

//BaseModel.php
protected $connection = 'mysql';

//BaseModelOne.php
protected $connection = 'mysqlOne';

Można rozszerzyć te modele, aby utworzyć więcej modeli dla tabel w każdym DB.

 0
Author: sumit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-06-21 10:52:30

Możesz również użyć systemu postgres fdw

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

Będziesz mógł podłączyć różne db w postgres. Następnie w jednym zapytaniu możesz uzyskać dostęp do tabel znajdujących się w różnych bazach danych.

 0
Author: Maks Shcherbyna,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-12-23 16:54:50