Frage Holen Sie die Datenbankanmeldeinformationen aus der Master-Datenbank und stellen Sie eine Verbindung zu anderen Datenbanken her


Ich habe eine instanzierte Webanwendung, die für jede Instanz unterschiedliche Datenbanken verwendet, aber dieselben Dateien verwendet.

Was ich beim Booten meiner Anwendung tun soll:

  1. Datenbankanmeldeinformationen aus der Master-Instanztabelle abrufen Diese Instanztabelle befindet sich in der Standardverbindung 'mysql', die ich in app / config / database.php definiert habe.
  2. Verbinden Sie sich ab diesem Zeitpunkt mit der Instanz-Datenbank (ich brauche die Master-Instanz-Datenbank nicht mehr)

Ich habe versucht, dies in meinem App: before () -Ereignis zu tun, aber das wird nicht funktionieren, da ich keine Sitzungstabelle in meiner Master-Datenbank habe. Wenn ich es vor dem Rückgabe-Array () in der Datenbank.php mache, kann es offensichtlich keine Verbindung herstellen, da es noch nicht die richtigen Master-Datenbank-Anmeldeinformationen hat.

Wo soll ich das machen? Soll ich einfach Sitzungen deaktivieren und in meiner App :: before () ausführen und danach Sitzungen aktivieren?


5
2018-04-24 10:05


Ursprung


Antworten:


Denke nicht, dass es möglich ist, aber hier ist eine Möglichkeit.

Verbindungen lesen / schreiben

Manchmal möchten Sie möglicherweise eine Datenbankverbindung für verwenden SELECT Aussagen und ein anderes für INSERT, UPDATE, und DELETE Aussagen. Laravel macht dies zu einem Kinderspiel, und die richtigen Verbindungen werden immer verwendet, unabhängig davon, ob Sie rohe Abfragen, den Abfrage-Generator oder das Eloquent-ORM verwenden.

Um zu sehen, wie Lese- / Schreibverbindungen konfiguriert werden sollten, schauen wir uns dieses Beispiel an:

'mysql' => array(
    'read' => array(
        'host' => '192.168.1.1',
    ),
    'write' => array(
        'host' => '196.168.1.2'
    ),
    'driver'    => 'mysql',
    'database'  => 'database',
    'username'  => 'root',
    'password'  => '',
    'charset'   => 'utf8',
    'collation' => 'utf8_unicode_ci',
    'prefix'    => '',
),

Beachten Sie, dass dem Konfigurations-Array zwei Schlüssel hinzugefügt wurden: Lesen und Schreiben. Beide Schlüssel haben Array-Werte, die einen einzigen Schlüssel enthalten: Host. Der Rest der Datenbankoptionen für die Lese- und Schreibverbindungen wird aus dem Haupt-MySQL-Array zusammengeführt. Daher müssen wir nur Elemente in die Lese- und Schreib-Arrays platzieren, wenn wir die Werte im Haupt-Array überschreiben möchten. Also, in diesem Fall, 192.168.1.1 wird als "gelesen" Verbindung verwendet, während 192.168.1.2 wird als "write" Verbindung verwendet. Die Datenbankanmeldeinformationen, das Präfix, der Zeichensatz und alle anderen Optionen im Haupt-MySQL-Array werden für beide Verbindungen freigegeben.


3
2018-04-24 12:05



Nach einigen Stunden des Experimentierens und Versuchens habe ich herausgefunden, dass die beste Option wirklich darin besteht, eine PDO-Instanz manuell in der Datei /app/config/database.php zu erstellen und die Datenbank-Anmeldeinformationen auf diese Weise zu erhalten:

// Get instance row
    if (!App::runningInConsole() && !array_key_exists('instance_found', $_ENV)) {
        $conn = new PDO('mysql:dbname=instances;host=127.0.0.1', 'root', 'password');
        $stmt = $conn->prepare('SELECT * FROM instances WHERE http_host=?');
        $stmt->bindParam(1, $_SERVER['HTTP_HOST']);
        $stmt->execute();

        $instance = $stmt->fetch(PDO::FETCH_OBJ);
        $conn = null;

        if (!$instance) {
            return Response::make('Whoops!', 404);
        } else {
            $_ENV['instance_found'] = true;

            $database = $instance->mysql_database;
            $username = $instance->mysql_username;
            $password = $instance->mysql_password;
        }
    }

1
2018-04-24 14:49