Laravel Migrationen schöne Möglichkeit der Deaktivierung von foreign key checks

Beim laufen laravel Migrationen, ich bin vor eine kleine Unannehmlichkeit. Ich benutze Laravel 5.1.

Da gibt es eine Menge von Tabellen mit vielen Beziehungen, ist es wahrscheinlich unmöglich, dass ich benennen Sie die migration-Dateien so führen Sie in der richtigen Reihenfolge, so dass keine foreign key-Einschränkung verletzt wird. Das war, was ich Tat, nachdem in der Vergangenheit, und es war sehr inpractical.

Was ich jetzt mache, ist die Definition jeder migration so:

class CreateSomeTable extends Migration
{
    public function up()
    {
        DB::statement('SET FOREIGN_KEY_CHECKS=0;');
        //my table definitions go here
        DB::statement('SET FOREIGN_KEY_CHECKS=1;');
    }

    public function down()
    {
        DB::statement('SET FOREIGN_KEY_CHECKS=0;');
        //drop table
        DB::statement('SET FOREIGN_KEY_CHECKS=1;');
    }
}

Das problem mit diesem ist, dass es mühsam zu schreiben und es clutters den code.

Habe ich auch gedacht, über das erstellen von zwei dummy-migration-Dateien, deren einziger Zweck es wäre, aktivieren und deaktivieren Sie die foreign key checks, und ich nannte Sie so, dass Sie am Anfang und am Ende jeder migration.

Wenn es eine elegante Lösung, wäre es möglich anwenden, um die seeding-Prozess als gut, da dies eher ein problem als gut.

Dies ist natürlich eine sehr improvisierte Lösung, und ich Frage, ob es einen besseren Weg, es zu tun. Gibt es einige beforeMigrate und afterMigrate Methoden, die ich überschreiben kann, oder etwas entlang jenen Linien?

Ist und wenn nicht, wie gehen Sie es tun?

Alle Erkenntnisse wäre zu begrüßen, ich mag alle Optionen, die ich festgestellt habe.

  • Sie sollten immer führen Sie in der richtigen Reihenfolge, wenn Sie handwerklich zu erstellen Migrations-und Sie haben den richtigen Zeitstempel. Sie laufen in der Reihenfolge der timestamps..
  • Ja, das ist es, was ich meinte, als bezeichnet wird die Datei um. Das Problem ist, manchmal nicht, erzeugen Sie in der richtigen Reihenfolge, oder manchmal, Sie könnten eine zyklische Abhängigkeit, d.h. beide Tabellen Fremdschlüssel auf einander beziehen. Egal, in welcher Reihenfolge Sie ausgeführt, dass beispielsweise, erhalten Sie eine foreign key-constraint-Verletzung, es sei denn, Sie deaktivieren die Prüfungen.
  • Der beste Weg, diese Problematik zu vermeiden ist, schafft eine migration mit der Erstellung der Tabelle die erste und dann noch eine, die erstellt/löscht Schlüssel.
  • Nicht besonders, aber Sie können deaktivieren Sie die foreign key checks auch so: \DB::getSchemaBuilder()->disableForeignKeyConstraints(). Nicht sicher, ob es einen besseren Weg, um diese Methode aufrufen.
  • Ich habe genau das gleiche problem wieder, mit noch einem anderen Projekt. Als einen temporären hack mache ich genau so, wie vorgeschlagen, in den OP; 2 dummy-migration-Dateien mit Zeitstempel versehene ausführen, bevor und nachdem alles andere, drehen foreign key checks auf und ab beziehungsweise. Es ist meine überzeugung, dass Laravel migration system ist grundlegend falsch. Überprüfung der Erstellung der Tabelle code-split zwischen all diesen Dateien ist hässlich und inconvienient. Von nun an ich werde bleiben, alles in einer einzigen migration-Datei, mit foreign key checks deaktiviert und aktiviert am Anfang und Ende, und alle schema Logik-übersichtlich angeordnet-zwischen.
InformationsquelleAutor Pavlin | 2015-12-15
Schreibe einen Kommentar