Ist es möglich, in Laravel auf einen Fremdschlüssel in einer anderen Datenbank zu verweisen?

Lesezeit: 3 Minuten

Benutzeravatar von cchapman
cchapman

Ich versuche, ein Modell und eine Migration für dieses Modell in Laravel 4.2 zu erstellen. Alle meine Laravel-Apps verwenden dieselbe MySQL-Datenbank namens laravel. Wir haben jedoch auch eine andere Datenbank (auf demselben Server) mit dem Namen main_db das enthält a users Tabelle, die ich gerne als Quelle einiger Fremdschlüssel in meinem eigenen verwenden würde laravel_users Tabelle in der laravel Datenbank.

Laut der Laravel-Dokumentation würde ich einen Fremdschlüssel mit diesem Code kennzeichnen:

$table->foreign('user_id')->references('id')->on('users');

Aber ich glaube, das setzt voraus, dass die 'users' Die Tabelle existiert in derselben Datenbank.

Ist es möglich, in Laravel datenbankübergreifende Fremdschlüssel zu erstellen? Müsste ich zuerst ein Modell erstellen, das das verwendet? users Tisch von main_db? Und ist es möglich, zwei verschiedene Datenbankverbindungen einzurichten? app/config/database.php?

Benutzeravatar von lukasgeiter
lukasgeber

Datenbankübergreifende Fremdschlüssel haben eigentlich nicht viel mit Laravel zu tun. Die eigentliche Frage ist, ob die Datenbank dies unterstützt. Und MySQL (zumindest mit InnoDB) unterstützt Fremdschlüsseleinschränkungen über mehrere Datenbanken hinweg. Sie müssen lediglich die Datenbank mit der Punktnotation angeben: db.table.

Was den Laravel-Schema-Builder betrifft, sollte dies funktionieren:

$table->foreign('user_id')->references('id')->on('main_db.users');
//                                                ^^^^^^^

Wenn Sie eine Fehlermeldung erhalten, prüfen Sie, ob die Spaltentypen identisch sind. (Sie können varchar nicht auf int verweisen oder umgekehrt, Schlüssel müssen vom gleichen Typ sein).

  • Oh wow. Ich liebe es, wenn die Dinge so sauber zusammenpassen. Vielen Dank. Aber nur zur Klarstellung: Müsste ich dann in Zukunft für jede Datenbank eine Punktnotation hinzufügen? Dh alle meine bisherigen Laravel-Modelle müssten nutzen laravel.xxxx Von hier an raus…?

    – cchapman

    10. März 2015 um 0:04

  • Gern geschehen. Nein, Sie müssen die Datenbank nur angeben, wenn sie sich von der Datenbank unterscheidet, in der sich die Tabelle befindet, zu der Sie den Schlüssel hinzufügen.

    – lukasgeber

    10. März 2015 um 5:43

  • Können Sie mir sagen, wo die Methode ist? references ist definiert? Blueprint::foreign kehrt zurück Fluent und dies enthält nicht references. Wo kann ich es also finden?!

    – Narbengesicht

    7. Okt. 2018 um 12:13

  • @scarface Es ist nirgendwo explizit definiert. Der Fluent Die Klasse akzeptiert alle Methodenaufrufe und legt im Wesentlichen nur intern Schlüssel-Wert-Paare fest. Quelle

    – lukasgeber

    7. Okt. 2018 um 12:35 Uhr

  • @lukasgeiter Danke. Ich habe diese magische Methode nicht in Betracht gezogen.

    – Narbengesicht

    7. Okt. 2018 um 18:20 Uhr

Zur späteren Bezugnahme: Wenn Sie jemals den Namen der Datenbank ändern, funktioniert dies nicht. Den Namen der Datenbank ermitteln Sie am besten anhand der Datenbankdefinition.

config/database.php

'auth_database' => [
    'driver' => 'mysql',
    'host' => env('DB_HOST', 'localhost'),
    '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,
],

Dann in Ihrer Migrationsdatei:

Schema::create('role_user', function (Blueprint $table) {
    $db = DB::connection('auth_database')->getDatabaseName();

    $table->integer('role_id')->unsigned();
    $table->foreign('role_id')->references('id')->on('roles');
    $table->integer('user_id')->unsigned();
    $table->foreign('user_id')->references('id')->on(new Expression($db . '.users'));
});

  • ich benutzte ->on(config('database.connections.mysql.database') . '.users') stattdessen.

    – Amir Hossein Abdollahi

    1. September 2020 um 11:28

Antwort von @lukasgeber hat bei mir mit den folgenden zwei Änderungen funktioniert:

1- Ich habe beide Datenbank-Engines geändert InnoDB.

2- Ich musste den Fremdschlüssel auf einen setzen Ganzzahl ohne Vorzeichen in der Migrationsdatei, da die Referenz eine vorzeichenlose Ganzzahl war und der Primärschlüssel war.

$table->integer('user_id')->unsigned()->change();

1452660cookie-checkIst es möglich, in Laravel auf einen Fremdschlüssel in einer anderen Datenbank zu verweisen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy