Zugriff auf eine BelongsToMany-Beziehung über mehrere Datenbanken in Laravel hinweg
Beim Arbeiten mit Modellen, die in verschiedenen Datenbanken gespeichert sind, kann es zu Problemen mit der BelongsToMany-Beziehung von Laravel kommen wenn sich die Pivot-Tabelle nicht in derselben Datenbank wie das Zielmodell befindet. Um dies zu umgehen, ist es notwendig, den Datenbanknamen der Pivot-Tabelle explizit anzugeben.
Ändern Sie dazu die „gehörtToMany“-Beziehung im Modell, das die Pivot-Tabelle enthält, wie folgt:
<code class="php">public function bs() { $database = $this->getConnection()->getDatabaseName(); return $this->belongsToMany('B', "$database.a_bs", 'a_id', 'b_id'); }</code>
Dieser Ansatz stellt sicher, dass Laravel in der Datenbank nach der Pivot-Tabelle sucht, die dem Modell entspricht, das die Beziehung enthält, und so das Problem löst.
Wenn Ihr Projekt jedoch SQLite-Datenbanken verwendet und Sie beabsichtigen, Komponententests durchzuführen, sind zusätzliche Überlegungen erforderlich sind notwendig. SQLite erfordert das Anhängen der Zieldatenbank an die Testverbindung, um den Zugriff auf die Pivot-Tabelle zu erleichtern. Dies kann mit dem folgenden Code erreicht werden:
<code class="php">public function bs() { $database = $this->getConnection()->getDatabaseName(); if (is_file($database)) { $connection = app('B')->getConnection()->getName(); $name = $this->getConnection()->getName(); \Illuminate\Support\Facades\DB::connection($connection)->statement("ATTACH DATABASE '$database' AS $name"); $database = $name; } return $this->belongsToMany('B', "$database.a_bs", 'a_id', 'b_id'); }</code>
Es ist wichtig, auf die Transaktionsnutzung zu achten. Wenn die aktuelle Verbindung Transaktionen verwendet, schlägt die ATTACH DATABASE-Anweisung fehl. Wenn umgekehrt die zugehörige Verbindung Transaktionen verwendet, werden die resultierenden Daten vor der aktuellen Verbindung verborgen.
Um Ihre angehängte Datenbank zu bereinigen, können Sie entweder einen Migrations-Rollback durchführen oder die Tabellen unter Beibehaltung ihrer Struktur kürzen.
Zu den weiteren Optionen gehören das Kopieren der angehängten Datenbank in eine temporäre Datei und das Ersetzen der Quelle nach dem Test oder die Nutzung der leicht zugänglichen Natur von SQLite-Datenbankdateien.
Das obige ist der detaillierte Inhalt vonWie greife ich in Laravel auf eine BelongsToMany-Beziehung über mehrere Datenbanken hinweg zu?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!