Sonntag, Dezember 8, 2019

Laravel Migration Ändern, um eine Spalte null-Werte zulässt

Erstellte ich eine migration mit unsigned user_id. Wie kann ich die Bearbeiten user_id in einer neuen migration zu machen es auch nullable()?

Schema::create('throttle', function(Blueprint $table)
{
    $table->increments('id');
    //this needs to also be nullable, how should the next migration be?
    $table->integer('user_id')->unsigned();
}
InformationsquelleAutor user391986 | 2014-06-25

9 Kommentare

  1. 206

    Laravel 5 nun unterstützt die änderung Spalte..

    Beispiel aus der offiziellen doc

    Schema::table('users', function($table)
    {
        $table->string('name', 50)->nullable()->change();
    });
    

    Quelle: http://laravel.com/docs/5.0/schema#changing-columns

    Laravel 4 bietet keine Unterstützung zur änderung von Spaltennamen. Sie schreiben roh-sql-Befehl.

      //getting Laravel App Instance
       $app = app();
    
      //getting laravel main version
       $laravelVer = explode('.',$app::VERSION);
    
        switch ($laravelVer[0]) {
    
            case('5') :                
                Schema::table('pro_categories_langs', function(Blueprint $t) {
                    $t->string('name', 100)->nullable()->default(null)->change();
                });               
                break;                
            /**
             * it is not L5 !!
             */
            default :                
                 DB::statement('ALTER TABLE `pro_categories_langs` MODIFY `name` VARCHAR(100) NULL;');                                  
        }
    
    • Thx für diese. Aber wie kann ich machen das Gegenteil? Wie ändern einer Spalte, die keine null-Werte zulassen? Irgendwelche Ideen?
    • Tun Sie dies versuchen ‚ $t->string („name“, 100)->Wechsel();‘
    • Nein, ich habe es mit DB::statement – und raw-SQL… Aber vielleicht werde ich nachher versuchen… Thx
    • Sie müssen verlangen, doctrine\dbal zu migrieren
    • lassen Sie ändern die Spalte wieder zurück.
    • ->ändern() erfordert die Installation der Doctrine DBAL-Paket, und es hat nicht grundsätzlich erkennen alle die gleiche Spalte Arten, die verfügbar sind out of the box von laravel.. zum Beispiel “ double wird nicht erkannt Spalte Typ zu DBAL.
    • Es würde nicht funktionieren, wenn Sie versuchen, benennen Sie die Spalte in der gleichen Funktion, die Sie ausführen müssen, um 2 Funktionen auf einer Tabelle ausführen, umbenennen und ändern.
    • Ich habe das gleiche problem und zwar füge ich die Lehre/dbal Abhängigkeit zu meinem Komponist.json-Datei, change Methode nicht erkannt und funktionieren nicht.Ich Laravel installieren 5.7.
    • Hallo @sarina ich habe nachgeschaut offizielle Laravel doc und ich kann sehen, es gibt keine änderung. Hast du es gelesen ? laravel.com/docs/5.7/migrations#modifying-columns Was ist der Fehler, wenn die Methode nicht funktioniert..
    • Hi. Mein problem ist gelöst. Ich sollte schreiben, bearbeitete Spalte in eine neue Migrations-Datei und migrieren, aber ich migrate previous migration-Datei.

  2. 149

    Ich gehe davon aus, dass Sie versuchen, zu Bearbeiten eine Spalte, die Sie bereits Hinzugefügt haben, Daten auf, so fallen die Spalte und hinzufügen wieder als eine null-Spalte ist nicht möglich ohne Daten zu verlieren. Wir werden alter die vorhandene Spalte.

    Jedoch, Laravel schema builder unterstützt keine änderung andere Spalten als die Umbenennung der Spalte.
    So müssen Sie zum ausführen von raw-Abfragen zu machen, wie diese:

    function up()
    {
        DB::statement('ALTER TABLE `throttle` MODIFY `user_id` INTEGER UNSIGNED NULL;');
    }
    

    Und um sicherzustellen, können Sie immer noch rollback der migration, wir erledigen den down() als gut.

    function down()
    {
        DB::statement('ALTER TABLE `throttle` MODIFY `user_id` INTEGER UNSIGNED NOT NULL;');
    }
    

    Einer Hinweis ist, dass, da Sie die Umwandlung zwischen null-Werte zulässt und keine null-Werte zulässt, müssen Sie sicherstellen, dass Sie bereinigen die Daten vor/nach der migration. So zu tun, dass in Ihrem Skript für die migration in beide Richtungen:

    function up()
    {
        DB::statement('ALTER TABLE `throttle` MODIFY `user_id` INTEGER UNSIGNED NULL;');
        DB::statement('UPDATE `throttle` SET `user_id` = NULL WHERE `user_id` = 0;');
    }
    
    function down()
    {
        DB::statement('UPDATE `throttle` SET `user_id` = 0 WHERE `user_id` IS NULL;');
        DB::statement('ALTER TABLE `throttle` MODIFY `user_id` INTEGER UNSIGNED NOT NULL;');
    }
    
    • Für Laravel 4, ersetzen query durch statement
    • das markiert werden soll, als die richtige Antwort.
    • Danke @Razor. Aktualisiert meine Antwort entsprechend.
    • In der down Funktion in der zweiten code-block wird die SQL-Anweisung sollte am Ende mit NOT NULL. (Die down Funktion in dem Dritten Beispiel ist korrekt.)
  3. 149

    Hier ist die vollständige Antwort für die zukünftigen Leser. Beachten Sie, dass dies nur möglich ist in Laravel 5+.

    Zunächst müssen Sie die doctrine/dbal Paket:

    composer require doctrine/dbal
    

    Nun in der migration Sie können dies tun, um die Spalte null-Werte zulässt:

    public function up()
    {
        Schema::table('users', function (Blueprint $table) {
            //change() tells the Schema builder that we are altering a table
            $table->integer('user_id')->unsigned()->nullable()->change();
        });
    }
    

    Können Sie sich Fragen, wie Sie zum zurücksetzen dieser Vorgang. Leider ist diese syntax wird nicht unterstützt:

    //Sadly does not work :'(
    $table->integer('user_id')->unsigned()->change();
    

    Dies ist der korrekte syntax zum wiederherstellen der migration:

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

    Oder wenn Sie es bevorzugen, können Sie ein raw-Abfrage:

    public function down()
    {
        /* Make user_id un-nullable */
        DB::statement('UPDATE `users` SET `user_id` = 0 WHERE `user_id` IS NULL;');
        DB::statement('ALTER TABLE `users` MODIFY `user_id` INTEGER UNSIGNED NOT NULL;');
    }
    

    Hoffentlich finden Sie diese Antwort hilfreich. 🙂

    • Dies ist die komplette Antwort für L5, aber es sollte erwähnt werden, dass, wenn ‚user_id‘ ist ein Fremdschlüssel, welcher es sein sollte, werden Sie nicht in der Lage, es zu ändern, es sei denn, Sie führen ‚DB::statement („SET FOREIGN_KEY_CHECKS = 0′);‘ erste. Und setzen Sie es wieder auf 1. wenn Sie fertig sind.
    • Danke, nullable(false) mich gerettet aus dem ziehen meine Haare, weil Sie nullable() ist nicht gut dokumentiert, und es gibt keine notNull() Funktion.
    • dies funktioniert nicht für fremde Schlüssel, mit postgres. versuchen SET FOREIGN_KEY_CHECKS = 0 gibt eine Fehlermeldung. Sie werden wahrscheinlich brauchen, um zu ändern, der die Tabelle der Einschränkungen durch die Verwendung einer raw query. siehe hier: postgresql.org/docs/current/static/sql-altertable.html
    • Dieser bricht meine tests. Die tests beginnen zu laufen und dann hängen. Ich vermute, die erste rollback bewirkt, dass diese. Ursachen hängen-tests für MySQL als auch für SQLite.
  4. 39

    Er sind, die vollständige migration für Laravel 5:

    public function up()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->unsignedInteger('user_id')->nullable()->change();
        });
    }
    
    public function down()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->unsignedInteger('user_id')->nullable(false)->change();
        });
    }
    

    Der Punkt ist, können Sie Sie entfernen nullable durch die übergabe false als argument.

  5. 15

    Wenn Sie geschieht, ändern Sie die Spalten und stolperte auf

    'Doctrine\DBAL\Driver\PDOMySql\Driver' not found
    

    dann einfach installieren

    composer require doctrine/dbal

  6. 5

    Hinzufügen Dmitri Chebotarev Antwort, als für Laravel 5+.

    Nach dass der doctrine/dbal Paket:

    composer require doctrine/dbal
    

    Können Sie dann eine migration mit nullable Spalten, etwa so:

    public function up()
    {
        Schema::table('users', function (Blueprint $table) {
            //change() tells the Schema builder that we are altering a table
            $table->integer('user_id')->unsigned()->nullable()->change();
        });
    }
    

    Wiederherstellen der operation zu tun:

    public function down()
    {
        /* turn off foreign key checks for a moment */
        DB::statement('SET FOREIGN_KEY_CHECKS = 0');
        /* set null values to 0 first */
        DB::statement('UPDATE `users` SET `user_id` = 0 WHERE `user_id` IS NULL;');
        /* alter table */
        DB::statement('ALTER TABLE `users` MODIFY `user_id` INTEGER UNSIGNED NOT NULL;');
        /* finally turn foreign key checks back on */
        DB::statement('SET FOREIGN_KEY_CHECKS = 1');
    

    }

  7. 3

    Hinzufügen Dmitri Chebotarev Antwort,

    Wenn Sie ändern wollen, mehrere Spalten zu einer Zeit , können Sie es wie unten

    DB::statement('
         ALTER TABLE `events` 
                MODIFY `event_date` DATE NOT NULL,
                MODIFY `event_start_time` TIME NOT NULL,
                MODIFY `event_end_time` TIME NOT NULL;
    ');
    
  8. 2

    Probieren Sie es aus:

    $table->integer('user_id')->unsigned()->nullable();
    
    • Es ändert nichts an vorhandenen Spalte
    • Sie vergaß ->change am Ende zu erwähnen, es Laravel 5+ nur
  9. 2

    Für Laravel 4.2, Unnawut die obige Antwort ist die beste. Aber wenn Sie mit dem Tabellen-Präfix, dann müssen Sie ändern Sie Ihren code ein wenig.

    function up()
    {
        $table_prefix = DB::getTablePrefix();
        DB::statement('ALTER TABLE `' . $table_prefix . 'throttle` MODIFY `user_id` INTEGER UNSIGNED NULL;');
    }
    

    Und um sicherzustellen, können Sie immer noch rollback der migration, wir erledigen den down() als gut.

    function down()
    {
        $table_prefix = DB::getTablePrefix();
        DB::statement('ALTER TABLE `' . $table_prefix . 'throttle` MODIFY `user_id` INTEGER UNSIGNED NOT NULL;');
    }
    

Kostenlose Online-Tests

Letzte Fragen

Tun ItemView löst Blase?

Ich habe eine CompositeView für eine Tabelle. Ich habe Trigger-set in der Kind-ItemView für jede Zeile... var TableRow = Marionette.ItemView.extend({ tagName:...

Wie kann ich untersuchen, WCF was 400 bad request über GET?

Die folgenden WCF-endpoint funktioniert gut mit dem WCF test client: AssetList ListFlaggedAssets(short processCode, string platform, string endpoint = "null", string portalId = "null", int...

Bei der Verwendung von UUIDs, sollte ich auch mit AUTO_INCREMENT?

Wir bauen eine neue web-app, die eine offline-iPad - /Android-app-version auf einer Reihe von lokalen Geräten, die Einsätze mit neuen Daten. Als solche benötigen...

Actionscript-Objekt, das verschiedene Eigenschaften

Wie kann ich die Anzahl der Eigenschaften in einer generischen Actionscript-Objekt? (Wie die Array-Länge) InformationsquelleAutor Fragsworth | 2011-01-15

Wie plot mehrere Graphen und nutzen Sie die Navigations-Taste im [matplotlib]

Die neueste version von matplotlib erstellt automatisch Navigations-buttons unter den graph. Aber die Beispiele, die ich finden alles im Internet zeigen, wie erstellen Sie...