Fügen Sie einer vorhandenen Tabelle in einer Migration eine neue Spalte hinzu


270

Ich kann mit dem Laravel-Framework nicht herausfinden, wie ich meiner vorhandenen Datenbanktabelle eine neue Spalte hinzufügen kann.

Ich habe versucht, die Migrationsdatei mit ...

<?php

public function up()
{
    Schema::create('users', function ($table) {
        $table->integer("paid");
    });
}

Im Terminal führe ich php artisan migrate:installund aus migrate.

Wie füge ich neue Spalten hinzu?


Es wäre nützlich, wenn Sie Fehler einschließen könnten, die Sie erhalten. Was erwarten Sie? und was passiert eigentlich?
Phill Sparks

9
Gute Frage. Es gibt eine Menge Migrationsdokumentation, die Ihnen die API und das erstmalige Erstellen von Tabellen zeigt. Dann schlägt alles fehl, wenn Sie Ihre App weiterentwickeln und Ihre Datenbankstruktur ändern müssen.
Andrew Koper

Antworten:


608

Um eine Migration zu erstellen, können Sie den Befehl migrate: make in der Artisan-CLI verwenden. Verwenden Sie einen bestimmten Namen, um Konflikte mit vorhandenen Modellen zu vermeiden

für Laravel 3:

php artisan migrate:make add_paid_to_users

für Laravel 5+:

php artisan make:migration add_paid_to_users_table --table=users

Sie müssen dann die Schema::table()Methode verwenden (wenn Sie auf eine vorhandene Tabelle zugreifen und keine neue erstellen). Und Sie können eine Spalte wie diese hinzufügen:

public function up()
{
    Schema::table('users', function($table) {
        $table->integer('paid');
    });
}

und vergessen Sie nicht, die Rollback-Option hinzuzufügen:

public function down()
{
    Schema::table('users', function($table) {
        $table->dropColumn('paid');
    });
}

Dann können Sie Ihre Migrationen ausführen:

php artisan migrate

Dies alles wird in der Dokumentation für Laravel 3 ausführlich behandelt:

Und für Laravel 4 / Laravel 5:

Bearbeiten:

Verwenden $table->integer('paid')->after('whichever_column');Sie diese Option, um dieses Feld nach einer bestimmten Spalte hinzuzufügen.


3
Justphp artisan migrate
Phill Sparks

Irgendwas stimmt nicht. Ich mache "db: make", um eine neue Migrationsdatei zu erstellen. Und dann setze ich die Schema :: Tabelle ('Benutzer', Funktion ($ Tabelle) {$ Tabelle-> Ganzzahl ('bezahlt');}); hinein. Führen Sie "php artisan migrate" aus, erhalten Sie jedoch einen schwerwiegenden Fehler: Benutzer der Klasse in /Applications/XAMPP/xamppfiles/htdocs/adsense/application/migrations/2013_05_28_122527_users.php in Zeile 3
kim larsen

Das Erstellen von Migrationen wird ebenfalls in der Dokumentation behandelt. Sie sollten ihm einen genaueren Namen geben, z. B. "add_paid_to_users", damit es nicht zu Konflikten mit Ihrem Modell kommt.
Phill Sparks

Es scheint, als würde eine Laravel 3-Dokument-URL zu den Laravel 4-Dokumenten umleiten. Hier sind die Links zu den 3 Dokumenten für Schema Builder und Migrationen

6
Ab Laravel 5 wäre dieser Befehl nunphp artisan make:migration add_paid_to_users
mikelovelyuk

64

Ich werde die Antwort von mike3875 für zukünftige Leser mit Laravel 5.1 und höher ergänzen.

Um die Dinge schneller zu machen, können Sie das Flag "--table" wie folgt verwenden:

php artisan make:migration add_paid_to_users --table="users"

Dadurch wird der Inhalt der Methode upund downautomatisch hinzugefügt :

/**
 * Run the migrations.
 *
 * @return void
 */
public function up()
{
    Schema::table('users', function (Blueprint $table) {
        //
    });
}

In ähnlicher Weise können Sie die --create["table_name"]Option beim Erstellen neuer Migrationen verwenden, um Ihren Migrationen mehr Boilerplate hinzuzufügen. Kleiner Punkt, aber hilfreich, wenn Sie viele davon machen!


1
Dies war in Laravel 5.0 nicht der Fall, Blueprintwurde in Laravel 5.1 hinzugefügt. Nur ein Punkt der Klarstellung ist alles.
Phill Sparks

@PhillSparks Du hast recht, danke, dass du meinen Fehler aufgefangen hast. Ich habe aktualisiert, um die Version zu verdeutlichen, in der dies verwendet werden kann.
CamelCase

24

Wenn Sie Laravel 5 verwenden, lautet der Befehl:

php artisan make:migration add_paid_to_users

Alle Befehle zum Erstellen von Dingen (Controller, Modelle, Migrationen usw.) wurden unter dem make:Befehl verschoben .

php artisan migrate ist immer noch das gleiche.


24

Laravel 5.6 und höher

für den Fall, dass Sie einer vorhandenen Tabelle eine neue Spalte als AUSLÄNDISCHEN SCHLÜSSEL hinzufügen möchten.

Erstellen Sie eine neue Migration, indem Sie den folgenden Befehl ausführen: make: migration

Beispiel:

php artisan make:migration add_store_id_to_users_table --table=users

Im Ordner Datenbank / Migrationen haben Sie eine neue Migrationsdatei, etwa:

2018_08_08_093431_add_store_id_to_users_table.php (siehe Kommentare)

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class AddStoreIdToUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('users', function (Blueprint $table) {

            // 1. Create new column
            // You probably want to make the new column nullable
            $table->integer('store_id')->unsigned()->nullable()->after('password');

            // 2. Create foreign key constraints
            $table->foreign('store_id')->references('id')->on('stores')->onDelete('SET NULL');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('users', function (Blueprint $table) {

            // 1. Drop foreign key constraints
            $table->dropForeign(['store_id']);

            // 2. Drop the column
            $table->dropColumn('store_id');
        });
    }
}

Führen Sie danach den folgenden Befehl aus:

php artisan migrate

Wenn Sie die letzte Migration aus irgendeinem Grund rückgängig machen möchten, führen Sie den folgenden Befehl aus:

php artisan migrate:rollback

Weitere Informationen zu Migrationen finden Sie in den Dokumenten


1
Sehr umfassende und relevante Antwort. Vielen Dank!
musicin3d

17

Sie können der ursprünglichen Schema::createMethode wie folgt neue Spalten hinzufügen :

Schema::create('users', function($table) {
    $table->integer("paied");
    $table->string("title");
    $table->text("description");
    $table->timestamps();
});

Wenn Sie bereits eine Tabelle erstellt haben, können Sie dieser Tabelle zusätzliche Spalten hinzufügen, indem Sie eine neue Migration erstellen und die folgende Schema::tableMethode verwenden:

Schema::table('users', function($table) {
    $table->string("title");
    $table->text("description");
    $table->timestamps();
});

Die Dokumentation ist diesbezüglich ziemlich gründlich und hat sich von Version 3 zu Version 4 nicht allzu sehr geändert .


Irgendwas stimmt nicht. Ich mache "db: make", um eine neue Migrationsdatei zu erstellen. Und dann setze ich die Schema :: Tabelle ('Benutzer', Funktion ($ Tabelle) {$ Tabelle-> Ganzzahl ('bezahlt');}); hinein. Führen Sie "php artisan migrate" aus, erhalten Sie jedoch einen schwerwiegenden Fehler: Benutzer der Klasse in /Applications/XAMPP/xamppfiles/htdocs/adsense/application/migrations/2013_05_28_122527_users.php in Zeile 3
kim larsen

Sie sollten jeder Migration beim Erstellen einen eindeutigen Namen geben. Normalerweise benenne ich die erste Erstellung create_users_table, wenn ich Spalten hinzufüge : add_email_password_columns_to_users.
Planer

Ja, wie Evolve sagt, ist es sicherlich besser, sich an die ursprünglichen Laravel-Designphilosophien zu halten und nur das add_Verb " " vor jeder Datei zu verwenden, um Änderungen zu verfolgen. Auf diese Weise ist es einfacher, Änderungen für die Versionskontrolle usw. zu verfolgen, da für jede Iteration eine neue Add-Datei erstellt wird. Wenn Sie einfach das " create_" weiter modifizieren würden, wäre es schwer zu wissen, dass x Mitarbeiter etwas durcheinander gebracht hat, indem er einen Index entfernt oder eine neue Spalte usw. usw. hinzugefügt hat. Zumindest macht das in meinem Kopf Sinn! :)
wired00

7

Sie können einfach Ihre vorhandene Migrationsdatei ändern, indem Sie beispielsweise eine Spalte in Ihre Tabelle einfügen und dann in Ihr Terminal Folgendes eingeben:

$ php artisan migrate:refresh

11
Aktualisieren wird die Tabelle leeren
JohnTaa

8
Das ist unglaublich gefährlich - wenn einige Leute die alte Version laufen lassen, haben andere die neue und es kommt zu Chaos. Wenn Sie in Liquibase eine Datei bearbeiten, schlägt dies fehl, es sei denn, Sie haben explizit Ausnahmen eingefügt, um dies zuzulassen, und dies ist nur in sehr wenigen Fällen möglich. Wenn Sie beispielsweise eine Spalte nicht null machen, wenn in einer Datenbank bereits Nulldaten enthalten sind, wird sie unterbrochen.
John Little

3
Es wäre besser, wenn Sie Ihre Antwort bearbeiten und erwähnen, dass sie Ihre Tabelle leeren würde, wäre es besser.
Abel

Hinweis: Dieser Befehl bereinigt ganze Datenbanktabellen . Wenn Sie ihn verwenden möchten, sichern Sie zuerst Ihre Datenbank
Udhav Sarvaiya

5

Dieses Ding wird auf Laravel 5.1 bearbeitet.

Führen Sie zuerst auf Ihrem Terminal diesen Code aus

php artisan make:migration add_paid_to_users --table=users

Gehen Sie danach in Ihr Projektverzeichnis und erweitern Sie die Verzeichnisdatenbank - Migration und bearbeiten Sie die Datei add_paid_to_users.php. Fügen Sie diesen Code hinzu

public function up()
{
    Schema::table('users', function (Blueprint $table) {
         $table->string('paid'); //just add this line
    });
}

Danach kehren Sie zu Ihrem Terminal zurück und führen diesen Befehl aus

php artisan migrate

Ich hoffe das hilft.


5

Setzen Sie zuerst Ihre vorherige Migration zurück

php artisan migrate:rollback

Danach können Sie Ihre vorhandene Migrationsdatei ändern (neue Spalten hinzufügen, umbenennen oder löschen) und anschließend Ihre Migrationsdatei erneut ausführen

php artisan migrate

0

Obwohl eine Migrationsdatei, wie bereits erwähnt, eine bewährte Methode ist, können Sie zur Not auch eine Spalte mit Basteln hinzufügen.

$ php artisan tinker

Hier ist ein Beispiel für einen Einzeiler für das Terminal:

Schema::table('users', function(\Illuminate\Database\Schema\Blueprint $table){ $table->integer('paid'); })



(Hier ist es zur besseren Lesbarkeit formatiert)

Schema::table('users', function(\Illuminate\Database\Schema\Blueprint $table){ 
    $table->integer('paid'); 
});
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.