Laravel mehrere Tabellen pro Migration

Lesezeit: 5 Minuten

Ich bin neu bei Laravel, also ein bisschen neu in Bezug auf die Best Practices dieses Frameworks. Ich versuche zu verstehen, wie ich am besten an die Erstellung einer Datenbank herangehen kann Migrationen.

Die wenigen Beispiele, die ich im Internet gefunden habe, einschließlich der Laravel-Dokumentation hier und hier, scheinen sich auf Migrationsskripte zu beziehen, die nur eine Tabelle verarbeiten. Ich erstelle eine Anwendung mit etwa 10 Tabellen, die alle mit Fremdschlüsseln miteinander verbunden sind, einige mit Viele-zu-Viele-Beziehungen.

  1. Ist der empfohlene Ansatz, eine Migrationsdatei pro Tabelle zu haben? Wenn ja warum? (Welche Nachteile hat es, wenn überhaupt, alle Skripts zur Tabellenerstellung in einer Datei abzulegen?)

  2. Was ist mit Fremdschlüsseln und Beziehungen? Wie erzwingt man diese Beziehungen und die Reihenfolge, in der Migrationen so ausgeführt werden, dass, wenn Tabelle1 auf eine Spalte in Tabelle2 verweist, Tabelle2 vor Tabelle1 erstellt wird?

  3. Was ist mit Many-to-Many-Beziehungen? Muss die Beziehungstabelle (Pivottabelle) auch manuell über ein separates Migrationsskript erstellt werden? Wenn ja, was stellt sicher, dass es nach den 2 verwandten Tabellen erstellt wird?

Während der Entwicklung Ihrer Anwendung sollten Sie sich meiner Meinung nach nicht allzu sehr darum kümmern, nur eine Tabelle pro Migration zu haben. Manchmal ist es einfach einfacher, einige Tabellen in einer einzigen Migration zusammenzufassen, aber sobald Ihr System in die Produktion geht, werden Sie es nicht sein in der Lage, so weiterzuarbeiten, da Sie nur in der Produktion migrieren und wahrscheinlich nie ein Rollback durchführen, sodass Ihre Migrationen sehr klein sein werden, manchmal müssen Sie eine Migration für eine einzelne Spaltenerstellung durchführen.

Die Vorteile des Einfügens von Tabellen in verschiedene Migrationen sind die gleichen wie bei einer dünnen Klasse. Je weniger Informationen Sie in einer Datei haben, desto einfacher ist es, sie zu verwalten und Änderungen daran vorzunehmen. Wenn Sie also alle Tabellen in eine einzige Migration packen, wird die Wartung schwieriger, aber das liegt wirklich an Ihnen.

Fremdschlüssel sind ein gutes Beispiel dafür, warum Sie eine Migration pro Tabelle und sogar pro Fremdschlüssel erstellen sollten: Jedes Mal, wenn Sie eine Tabelle im Zusammenhang mit Fremdschlüsseln zurücksetzen, müssen Sie zuerst alle Fremdabhängigkeiten löschen, deshalb erstellt Laravel eine Migration sie alle in der gleiche Reihenfolge, es hilft Ihnen, niemals einen Tisch fallen zu lassen. Erstellen Sie also zuerst Ihre Tabellenmigrationen und dann Ihre Fremdschlüsselmigrationen. Wenn Sie also ein Rollback durchführen, werden zuerst die Einschränkungen und dann die Tabellen zurückgesetzt.

Ich erstelle Fremdschlüssel für eine Tabelle in derselben Migration dieser Tabelle, es sei denn, ich habe zu viele Fremdschlüssel. Aber ich erstelle immer einen Fremdschlüssel in einem separaten Schema::table() Befehl, da einige Datenbanken Sie benötigen, um die Spalte zu haben, bevor Sie die Einschränkung daran anhängen:

public function up()
{
    Schema::create('statuses', function(Blueprint $table)
    {
        $table->string('id', 64)->primary();

        $table->string('user_id', 64)->index();
        $table->text('body');

        $table->timestamps();
    });

    Schema::table('statuses', function(Blueprint $table)
    {
        $table->foreign('user_id')
                ->references('id')
                ->on('users')
                ->onUpdate('cascade')
                ->onDelete('cascade');
    });
}

Ungefähr viele zu viele, wenn Sie die Tabelle und die Fremdschlüssel zusammen erstellen, sollten Sie zuerst die Master- und dann die Pivot-Tabellen erstellen, aber wenn Sie Ihre Fremdschlüssel in separaten Migrationen erstellen, erstellen Sie zuerst die Tabellen (Reihenfolge spielt keine Rolle, aber es ist auch besser, in diesen Fällen organisiert zu sein) und dann die Migrationen für die Fremdschlüssel.

Während der Entwicklung nehme ich viele Änderungen an meinen Tabellen vor, also komme ich immer wieder darauf zurück, also mache ich das, wenn ich eine Migration ändere:

1) php artisan migrate:reset viele Male

2) Migration ändern

3) php artisan migrate

Wenn ich nur eine neue erstelle, habe ich normalerweise keine Probleme, da Migrationen normalerweise idepotent sind.

Ihre letzte Frage wurde bereits beantwortet, aber ich sage es noch einmal: Laravel benennt die Migrationsdateien mit Zeitstempeln, so wie Sie niemals eine Migration ausführen müssen, bevor eine andere davor erstellt wurde:

2014_07_16_190821_create_statuses_table

Und der Name der Migrationsangelegenheit, denn dieser oben wird diese Klasse erstellen:

CreateStatusesTable

Eine Sache, die Sie also tun müssen, ist, jede Migration mit einem anderen Namen zu erstellen, sonst werden Sie am Ende zwei Klassen mit demselben Namen haben und nicht Laravel, sondern PHP wird sich darüber beschweren.

  • Vielen Dank für Ihre Erklärung. Es ist sehr hilfreich. Ja, ich verstehe die Notwendigkeit kleiner inkrementeller Änderungen, sobald die Anwendung in Produktion ist. Ich war mir nicht sicher, ob die anfängliche Erstellung der Basis für den Großteil der Tabellen mich zum Laufen bringen sollte. Angesichts der Tatsache, dass die Zeitstempel tatsächlich die Reihenfolge der Migrationsausführung erzwingen (das habe ich verpasst), sollte ich mir keine Sorgen machen müssen, dass Beziehungen aufgrund nicht vorhandener Tabellen nicht erstellt werden. Danke noch einmal!

    – jbx

    25. September 2014 um 0:29 Uhr

  • Endlich ein paar gute Laravel-Infos für den praktischen Gebrauch. Ihre Tutorials und Dokumente sind wirklich großartig, aber sie enthalten normalerweise grundlegende Anwendungsfälle, nicht das Zeug, das für ernsthaftes Programmieren benötigt wird.

    – Srneczek

    3. Juni 2015 um 12:32 Uhr

  • Sehr schöne Antwort, ich dachte, dies sei der Fall, aber ich bin froh, dass Sie es bestätigt haben, und es macht Sinn, warum, aber ich kann sehen, warum das OP die Frage gestellt hat, da ich mich dasselbe gefragt habe.

    – Rosscooper

    12. April 2016 um 23:12 Uhr

1146370cookie-checkLaravel mehrere Tabellen pro Migration

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

Privacy policy