Verwendung mehrerer Datenbanken in Laravel

225

Ich möchte mehrere Datenbanken in meinem System kombinieren. Die Datenbank ist meistens MySQL. Dies kann jedoch in Zukunft anders sein, dh der Administrator kann solche Berichte erstellen, die als Quelle für ein heterogenes Datenbanksystem dienen.

Meine Frage ist also, ob Laravel eine Fassade bietet , um mit solchen Situationen fertig zu werden. Oder hat irgendein anderes Framework geeignetere Fähigkeiten für Probleme?

Chintan7027
quelle

Antworten:

470

Verwenden von .env> = 5.0 (getestet auf 5.5)

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

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

Hinweis: In mysql2wenn DB_username und DB_PASSWORD gleich ist, dann können Sie verwenden , env('DB_USERNAME')die in metioned ist .enversten Zeilen.

Ohne .env<5,0

Verbindungen definieren

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

Führen Sie einfach die connection()Methode aus, um anzugeben, welche Verbindung verwendet werden soll

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

Abfrage Ersteller

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

Beredt

Legen Sie die $connectionVariable in Ihrem Modell fest

class SomeModel extends Eloquent {

    protected $connection = 'mysql2';

}

Sie können die Verbindung auch zur Laufzeit über die setConnectionMethode oder die onstatische Methode definieren:

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

}

Hinweis Seien Sie vorsichtig beim Versuch, Beziehungen zu Tabellen über Datenbanken hinweg aufzubauen! Dies ist möglich, kann jedoch mit einigen Einschränkungen verbunden sein und hängt davon ab, über welche Datenbank und / oder Datenbankeinstellungen Sie verfügen.


Von Laravel Docs

Verwenden mehrerer Datenbankverbindungen

Wenn Sie mehrere Verbindungen verwenden, können Sie connectionüber die Verbindungsmethode an der DBFassade auf jede zugreifen . Die namean die connectionMethode übergebene Verbindung sollte einer der in Ihrer config/database.phpKonfigurationsdatei aufgeführten Verbindungen entsprechen :

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

Sie können auch mit der getPdo-Methode für eine Verbindungsinstanz auf die zugrunde liegende unformatierte PDO-Instanz zugreifen:

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

Nützliche Links

  1. Laravel 5 Mehrfachdatenbankverbindung FROM laracasts.com
  2. Verbinden Sie mehrere Datenbanken in Laravel FROM tutsnare.com
  3. Mehrere DB-Verbindungen in Laravel FROM fideloper.com
Abdulla Nilam
quelle
1
Sie können verwenden class SomeModel extends Model { und auch sicherstellen, dass Sie Get-Werte aus der env-Datei entfernt haben, wie env('DB_DATABASE', 'name')beim Erstellen eines neuen DB-Konfigurationsarrays in der Datei database.php, wie @sba erwähnt hat
Sadee
1
Hey, ich benutze Lumen und für den Datenbankkonfigurationsteil habe ich nur die Datei ".env". Nicht database.php. Wie kann ich das beheben?
Chanaka De Silva
1
@ChanakaDeSilva Sie erstellen einfach einen Konfigurationsordner und eine database.php-Datei für Lumen. Anscheinend überprüft Lumen ständig, ob diese Datei vorhanden ist, und wird sie verwenden, wenn dies der Fall ist.
Ecksters
2
Dank bro Ich glaube , ich diesen Job übernehmen jetzt; p
binar
1
@AbdullaNilam some1 kam zu mir, um Multidb-App zu machen. Zuerst dachte ich, ich weiß nicht, ob es möglich ist, jetzt weiß ich, dass es einfach ist. P
binar
12

In Laravel 5.1 geben Sie die Verbindung an:

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

Standardmäßig verwendet Laravel die Standardverbindung. Es ist einfach, nicht wahr?

Lesen Sie hier mehr: http://laravel.com/docs/5.1/database#accessing-connections

schellingerht
quelle
Was ist mit Eloquent in Laravel 5.1?
Simo
1
@ Simo, siehe die Antwort von Abdulla.
schellingerht
Ich habe einen vollständigen Artikel für den Sam geschrieben, den Sie unter <a href=" stackcoder.in/posts/… 7.x überprüfen können. 7.x Mehrere Datenbankverbindungen, Migrationen, Beziehungen und Abfragen</a>
Channaveer Hakari
6

Funktioniert eigentlich DB::connection('name')->select(..)nicht für mich, weil 'Name' in doppelten Anführungszeichen stehen muss: "Name"

Trotzdem wird die Auswahlabfrage für meine Standardverbindung ausgeführt. Ich versuche immer noch herauszufinden, wie ich Laravel davon überzeugen kann, so zu arbeiten, wie es beabsichtigt ist: Ändern Sie die Verbindung.

Edit: Ich habe es herausgefunden. Nach dem Debuggen von Laravels DatabaseManager stellte sich heraus, dass meine database.php (Konfigurationsdatei) (in $ this-> app) falsch war. Im Abschnitt "Verbindungen" hatte ich Sachen wie "Datenbank" mit Werten derjenigen, aus denen ich sie kopiert habe. In klaren Worten statt

env('DB_DATABASE', 'name')

Ich musste so etwas platzieren

'myNewName'

da alle Verbindungen mit den gleichen Werten für die Datenbank, den Benutzernamen, das Passwort usw. aufgelistet wurden, ist dies natürlich wenig sinnvoll, wenn ich auf mindestens einen anderen Datenbanknamen zugreifen möchte

Daher landete ich jedes Mal, wenn ich etwas aus einer anderen Datenbank auswählen wollte, in meiner Standarddatenbank

sba
quelle
1
Danke dir! Du hast meine geistige Gesundheit gerettet. Ich habe versucht herauszufinden, warum sich alle meine Abfragen auf die Standarddatenbank bezogen. Dann habe ich Ihren Beitrag gelesen und festgestellt, dass env immer die .env-Werte zurückgegeben hat und der zweite Parameter nur ein Fallback war, den Laravel nicht verwendet hat.
Moha
Off-Topic: Es wäre großartig, wenn Administratoren meine Beiträge nicht manipulieren würden. Oder schreib mir wenigstens eine private Nachricht, was und warum sie ändern wollen. Ich habe nicht herausgefunden, wie man private Nachrichten verschickt.
sba
Ich hatte ein ähnliches Problem, ich habe den Wert geändert, aber nicht den Schlüssel. Es funktionierte wie folgt: 'database' => env ('DB_NEW_DATABASE', 'myNewDatabase'). Gut erkannt!
Fellipe Sanches
0

Laravel bietet integrierte Unterstützung für mehrere Datenbanksysteme. Sie müssen die Verbindungsdetails in der Datei config / database.php angeben

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

Sobald Sie dies haben, können Sie zwei Basismodellklassen für jede Verbindung erstellen und den Verbindungsnamen in diesen Modellen definieren

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

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

Sie können diese Modelle erweitern, um weitere Modelle für Tabellen in jeder Datenbank zu erstellen.

sumit
quelle