webentwicklung-frage-antwort-db.com.de

Verwendung mehrerer Datenbanken in Laravel

Ich möchte mehrere Datenbanken in meinem System kombinieren. Die meiste Zeit ist die Datenbank MySQL; Dies kann jedoch in Zukunft anders sein, d. h., der Administrator kann solche Berichte generieren, bei denen es sich um Quelle eines heterogenen Datenbanksystems handelt.

Also meine Frage ist Gibt es Laravel eine Fassade um mit solchen Situationen umzugehen oder ist irgendein anderes Framework für Probleme geeigneter?

165
Chintan7027

Mit .env> = 5.0 (getestet auf 5.5)

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

In 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: Wenn in mysql2 DB_Benutzername und DB_Kennwort identisch sind, können Sie env('DB_USERNAME') verwenden, das in den ersten paar Zeilen in .env Angegeben wird.

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 Methode connection() aus, um anzugeben, welche Verbindung verwendet werden soll

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

Query Builder

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

Beredsam

Stellen Sie die Variable $connection In Ihrem Modell ein

class SomeModel extends Eloquent {

    protected $connection = 'mysql2';

}

Sie können die Verbindung auch zur Laufzeit über die Methode setConnection oder die statische Methode on 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, wenn Sie versuchen, datenbankübergreifende Beziehungen mit Tabellen aufzubauen! Dies ist möglich, kann jedoch einige Einschränkungen mit sich bringen und hängt davon ab, welche Datenbank und/oder Datenbankeinstellungen Sie haben.


Von Laravel Docs

Verwenden mehrerer Datenbankverbindungen

Bei Verwendung mehrerer Verbindungen können Sie auf jede connection über die Verbindungsmethode an der DB Fassade zugreifen. Die name, die an die connection -Methode übergeben wurde, sollte einer der Verbindungen entsprechen, die in Ihrer config/database.php Konfigurationsdatei:

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

Sie können auch mit der Methode getPdo auf einer Verbindungsinstanz auf die unformatierte, zugrunde liegende PDO-Instanz zugreifen:

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

Nützliche Links

  1. Laravel 5 mehrfache Datenbankverbindung FROM laracasts.com
  2. Verbinden Sie mehrere Datenbanken in laravel FROM tutsnare.com
  3. Mehrere DB-Verbindungen in Laravel FROM fideloper.com
353
Abdulla Nilam

In Laravel 5.1 geben Sie die Verbindung an:

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

Standard, Laravel verwendet die Standardverbindung. Es ist einfach, nicht wahr?

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

9
schellingerht

Tatsächlich funktioniert DB::connection('name')->select(..) bei mir nicht, da 'name' in doppelten Anführungszeichen stehen muss: "name"

Die Auswahlabfrage wird weiterhin auf meiner Standardverbindung ausgeführt. Ich versuche immer noch herauszufinden, wie ich Laravel) davon überzeugen kann, so zu arbeiten, wie es beabsichtigt ist: Ändere die Verbindung.

Edit: Ich habe es herausgefunden. Nach dem Debuggen von Laravels DatabaseManager stellte sich heraus, dass meine database.php (Konfigurationsdatei) (innerhalb von $ this-> app) falsch war. In der Sektion "Verbindungen" hatte ich Sachen wie "Datenbank" mit Werten von denen, von 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 datenbank, benutzername, passwort usw. aufgelistet wurden, macht das natürlich wenig sinn, wenn ich zumindest auf einen anderen datenbanknamen zugreifen möchte

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

4
sba

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

Anschließend können Sie für jede Verbindung zwei Basismodellklassen 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.

0
sumit