Cum să utilizați mai multe baze de date în Laravel (Programare, Php, Mysql, Bază De Date, Laravel)

Chintan7027 a intrebat.

Vreau să combin mai multe baze de date în sistemul meu. De cele mai multe ori, baza de date este MySQL; dar poate fi diferită în viitor, adică Admin poate genera astfel de rapoarte care este să utilizeze sursa de utilizare a unor baze de date eterogene sistem de baze de date eterogene.

Așadar, întrebarea mea este Laravel oferă vreo fațadă pentru a face față unor astfel de situații? Sau orice alt cadru are capacități mai potrivite pentru această problemă?

5 răspunsuri
Abdulla Nilam

Folosind .env >= 5.0 (testat pe 5.5)

În .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

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

Notă: În mysql2 dacă DB_username și DB_password sunt identice, atunci puteți folosi env('DB_USERNAME') care este menționat în .env primele câteva rânduri.

Fără .env <5.0

Definiți conexiunile

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

Schema

Pentru a specifica ce conexiune să utilizați, pur și simplu rulați comanda connection() metoda

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

Query Builder

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

Eloquent

Setați opțiunea $connection în modelul dvs.

class SomeModel extends Eloquent {

    protected $connection = 'mysql2';

}

De asemenea, puteți defini conexiunea în timpul execuției prin intermediul funcției setConnection sau prin metoda on metoda statică:

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

}

Notă Fiți atenți la încercarea de a construi relații cu tabele între baze de date! Acest lucru este posibil, dar poate fi însoțit de unele avertismente și depinde de baza de date și/sau de setările bazei de date pe care le aveți.


Din Laravel Docs

Utilizarea conexiunilor multiple la baze de date

Atunci când utilizați conexiuni multiple, puteți accesa fiecare connection prin intermediul metodei de conectare de pe DB fațadă. Adresa name transmisă la metoda connection ar trebui să corespundă uneia dintre conexiunile enumerate în lista din config/database.php în fișierul de configurare:

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

De asemenea, puteți accesa instanța PDO brută, subiacentă, utilizând metoda getPdo pe o instanță de conexiune:

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

Legături utile

  1. Laravel 5 conexiune multiplă la baze de date multiple FROM laracasts.com
  2. Conectarea mai multor baze de date în laravel FROM tutsnare.com
  3. Conexiuni multiple de baze de date în Laravel FROM fideloper.com

Comentarii

  • Puteți utiliza class SomeModel extends Model { și, de asemenea, asigurați-vă că ați eliminat valorile get din fișierul env ca env('DB_DATABASE', 'name') atunci când creați o nouă matrice de configurare DB în fișierul database.php, așa cum a menționat @sba –  > Por Sadee.
  • Hei, folosesc Lumen și pentru partea de configurare a bazei de date, am doar fișierul „.env”. Nu și database.php. Deci, cum pot rezolva acest lucru? –  > Por Chanaka De Silva.
  • @ChanakaDeSilva Trebuie doar să creați un dosar config și un fișier database.php în el pentru Lumen. Aparent, Lumen verifică în mod constant dacă acel fișier există și îl va folosi dacă există. –  > Por Ecksters.
  • Mulțumesc frate, cred că voi accepta acest job acum ;p –  > Por binar.
  • @AbdullaNilam some1 a venit la mine pentru a face o aplicație multidb primul gând a fost că nu știu dacă este posibil, acum știu că este simplu ;p –  > Por binar.
schellingerht

În Laravel 5.1, specificați conexiunea:

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

Default, Laravel utilizează conexiunea implicită. Este simplu, nu-i așa?

Citiți mai multe aici: http://laravel.com/docs/5.1/database#accessing-connections

Comentarii

  • în Laravel 5.1, ce se întâmplă cu Eloquent? –  > Por simo.
  • @simo, consultați răspunsul lui Abdulla. –  > Por schellingerht.
  • Am scris un articol complet pentru sam îl puteți verifica la <a href=”stackcoder.in/posts/… 7.x Conexiuni multiple de baze de date, migrări, relații &; interogare</a> –  > Por Channaveer Hakari.
sba

De fapt, DB::connection('name')->select(..) nu funcționează pentru mine, deoarece „nume” trebuie să fie între ghilimele duble: „nume”

Cu toate acestea, interogarea select este executată pe conexiunea mea implicită. Încă încerc să-mi dau seama, cum să-l conving pe Laravel să lucreze așa cum este prevăzut: să schimbe conexiunea.

Edit: Mi-am dat seama. După ce am depanat Laravels DatabaseManager, s-a dovedit că database.php (fișierul meu de configurare) (în interiorul $this->app) era greșit. În secțiunea „connections” aveam chestii de genul „database” cu valori ale celui din care l-am copiat. În termeni clari, în loc de

env('DB_DATABASE', 'name')

trebuia să pun ceva de genul

'myNewName'

deoarece toate conexiunile erau listate cu aceleași valori pentru baza de date, nume de utilizator, parolă etc., ceea ce, desigur, nu prea are sens dacă vreau să accesez cel puțin un alt nume de bază de date

Prin urmare, de fiecare dată când voiam să selectez ceva dintr-o altă bază de date, ajungeam întotdeauna în baza mea de date implicită

Comentarii

  • Vă mulțumesc! Mi-ați salvat sănătatea mintală. Am încercat să-mi dau seama de ce toate interogările mele se refereau la baza de date implicită. Apoi am citit postarea dvs. și mi-am dat seama că env returna întotdeauna valorile .env, iar cel de-al doilea parametru era doar o soluție de rezervă pe care Laravel nu o folosea. –  > Por Moha.
  • Off-topic: ar fi grozav, dacă administratorii nu ar manipula postările mele. Sau măcar să-mi scrie un mesaj privat ce și de ce vor să schimbe. Nu mi-am dat seama cum să trimit mesaje private. –  > Por sba.
  • Am avut o problemă similară, am schimbat valoarea dar nu și cheia. A funcționat în felul următor: ‘database’ => env(‘DB_NEW_DATABASE’, ‘myNewDatabase’). Am reținut! –  > Por Fellipe Sanches.
sumit

Laravel are suport încorporat pentru mai multe sisteme de baze de date, trebuie să furnizați detaliile de conectare în config/database.php fișier

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

Odată ce aveți acest lucru, puteți crea două clase de model de bază pentru fiecare conexiune și definiți numele conexiunii în aceste modele

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

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

Puteți extinde aceste modele pentru a crea mai multe modele pentru tabelele din fiecare BD.

Maks Shcherbyna

De asemenea, puteți utiliza sistemul postgres fdw

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

Veți putea să conectați diferite db în postgres. După aceea, într-o singură interogare, puteți accesa tabele care se află în baze de date diferite.