2016-05-07 2 views
5

Ich brauche eine Teilmenge von Datensätzen aus einer Datenbank zur anderen in Laravel 4.2Laravel 4.2: Kopieren von Datenbankeinträgen aus einer Datenbank in eine andere

ich eine handwerkliche Aufgabe geschrieben habe zu kopieren, die die Modelle lädt, die ich kopieren müssen von der "Standard" -Datenbankverbindung und müssen sie nun in der zweiten Datenbankverbindung speichern (die in config/database.php definiert ist). Was ich nicht finden kann, ist eine Möglichkeit, die save() -Methode des Modells zum Speichern in einer anderen als der Standardverbindung zu verwenden.

Ist das möglich? Kann ich meine Saves an die zweite Datenbankverbindung "pushen"? Oder muss ich in eine "Pull" -Logik wechseln, meine Datenbankverbindungsdefinitionen umkehren und die Daten von der "zweiten" Verbindung laden, bevor ich sie auf "Standard" speichere?

Antwort

1

Wie @Filip hat angedeutet, ist es notwendig, die Verbindung auf dem Modell mit der zweiten (Ziel) Datenbank einzustellen, bevor das Modell zu speichern.

Allerdings ist es auch notwendig, die id auf null zu setzen (es sei denn, Sie sind sicher, dass kein Datensatz mit dieser ID auf der zweiten Datenbank vorhanden ist, das konnte ich nicht), um sicherzustellen, dass ein neuer Inkrementieren id Wert zugewiesen werden.

Und es ist auch notwendig, die exists Eigenschaft des Modells false vor dem Speichern zu setzen. Dieser Wert ist true im Modell nach dem Lesen des Datensatzes aus der Quelldatenbank, weil der Datensatz erfolgreich von dort gelesen wurde (anstatt als neuer Datensatz erstellt zu werden). Fehler beim Zurücksetzen von exists führten dazu, dass Laravel versuchte, eine UPDATE WHERE id = $model->id auszuführen, die nichts in die Datenbank schreiben würde, weil es keinen übereinstimmenden Datensatz (mit einer Null-ID) zum Aktualisieren gab. Die Einstellung exists auf false stellt sicher, dass die Sicherung als INSERT ausgeführt wird.

1

Zunächst einmal haben Sie die secoundary Verbindung in app/conifg/database.php definieren und dann in connections zum Beispiel:

'second_db_conn' => [ 
     'driver' => 'mysql', 
     'host'  => $_SERVER['MYSQL_HOST'], 
     'database' => $_SERVER['MYSQL_DATABASE'], 
     'username' => $_SERVER['MYSQL_USERNAME'], 
     'password' => $_SERVER['MYSQL_PASSWORD'], 
     'charset' => 'utf8', 
     'collation' => 'utf8_unicode_ci', 
     'prefix' => '', 
    ], 

Dann setzen Sie diese Verbindung auf yout Modell - speichern - und wechseln Sie wieder auf den Standardwert (in meinem Beispiel ist ein mysql):

$model->setConnection('second_db_conn')->save(); 
$model->setConnection('mysql'); 
+1

Danke, ich hatte schließlich herausgefunden, dass ich die Verbindung im Modell einstellen musste .... außer dass ich herausfand, dass dies versuchte, eine UPDATE-Transaktion statt einer INSERT-Anweisung auszuführen $ model-> exists = false 'vor dem 'save()', andernfalls war die' exists'-Eigenschaft immer true vom Lesen der ersten Datenbankverbindung, also behandelte Laravel sie als UPDATE und UPDATING funktionierte nicht, außer der Datensatz bereits in der zweiten Datenbank vorhanden –

Verwandte Themen