Aggiungi una nuova colonna alla tabella esistente in una migrazione


270

Non riesco a capire come aggiungere una nuova colonna alla mia tabella di database esistente usando il framework Laravel.

Ho provato a modificare il file di migrazione utilizzando ...

<?php

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

Nel terminale, eseguo php artisan migrate:installe migrate.

Come faccio ad aggiungere nuove colonne?


Sarebbe utile se potessi includere eventuali errori che stai riscontrando; cosa ti aspetti che accada; e cosa succede realmente?
Phill Sparks,

9
Ottima domanda Esiste molta documentazione sulla migrazione, che mostra l'API e come creare tabelle la PRIMA VOLTA. Quindi tutto fallisce man mano che sviluppi di più la tua app e devi modificare la tua struttura db.
Andrew Koper,

Risposte:


611

Per creare una migrazione, è possibile utilizzare il comando migrate: make sulla CLI Artisan. Utilizzare un nome specifico per evitare lo scontro con i modelli esistenti

per Laravel 3:

php artisan migrate:make add_paid_to_users

per Laravel 5+:

php artisan make:migration add_paid_to_users_table --table=users

È quindi necessario utilizzare il Schema::table()metodo (mentre si accede a una tabella esistente, non crearne una nuova). E puoi aggiungere una colonna come questa:

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

e non dimenticare di aggiungere l'opzione di rollback:

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

Quindi puoi eseguire le tue migrazioni:

php artisan migrate

Tutto ciò è ben coperto nella documentazione di Laravel 3:

E per Laravel 4 / Laravel 5:

Modificare:

utilizzare $table->integer('paid')->after('whichever_column');per aggiungere questo campo dopo una colonna specifica.


3
Justphp artisan migrate
Phill Sparks,

Qualcosa è sbagliato. Faccio "db: make" per creare un nuovo file di migrazione. E poi ho inserito lo Schema :: table ('utenti', funzione ($ tabella) {$ tabella-> intero ('pagato');}); dentro. Ed esegui "php artisan migrate", ma si verifica un errore irreversibile: impossibile dichiarare nuovamente gli utenti della classe in /Applications/XAMPP/xamppfiles/htdocs/adsense/application/migrations/2013_05_28_122527_users.php sulla riga 3
Kim Larsen,

Anche la creazione di migrazioni è descritta nella documentazione. Dovresti dargli un nome più specifico, come "add_paid_to_users", in questo modo non si scontrerà con lo scontro del tuo modello.
Phill Sparks,

Sembra che qualsiasi URL di documenti Laravel 3 reindirizzi ai documenti di Laravel 4. Ecco i collegamenti al documento 3 per il generatore di schemi e le migrazioni

6
A partire da Laravel 5, questo comando sarebbe oraphp artisan make:migration add_paid_to_users
mikelovelyuk

64

Aggiungerò la risposta di mike3875 per i futuri lettori che utilizzano Laravel 5.1 e versioni successive.

Per rendere le cose più veloci, puoi usare il flag "--table" in questo modo:

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

Ciò aggiungerà automaticamente il contenuto del metodo upe down:

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

Allo stesso modo, è possibile utilizzare l' --create["table_name"]opzione durante la creazione di nuove migrazioni che aggiungeranno più boilerplate alle migrazioni. Piccolo punto, ma utile quando ne fai un sacco!


2
Questo non era il caso di Laravel 5.0, è Blueprintstato aggiunto in Laravel 5.1. Solo un punto di chiarimento è tutto.
Phill Sparks,

@PhillSparks Hai ragione, grazie per aver colto il mio errore. Ho aggiornato per chiarire la versione in cui questo può essere utilizzato.
CamelCase,

24

Se stai usando Laravel 5, il comando sarebbe;

php artisan make:migration add_paid_to_users

Tutti i comandi per creare cose (controller, modelli, migrazioni ecc.) Sono stati spostati sotto il make:comando.

php artisan migrate è comunque lo stesso.


24

laravel 5.6 e versioni successive

nel caso in cui si desideri aggiungere una nuova colonna come CHIAVE ESTERA a una tabella esistente.

Crea una nuova migrazione eseguendo questo comando: make: migrazione

Esempio :

php artisan make:migration add_store_id_to_users_table --table=users

Nella cartella database / migrations hai un nuovo file di migrazione, qualcosa del tipo:

2018_08_08_093431_add_store_id_to_users_table.php (vedi i commenti)

<?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');
        });
    }
}

Dopodiché esegui il comando:

php artisan migrate

Nel caso in cui desideri annullare l'ultima migrazione per qualsiasi motivo, esegui questo comando:

php artisan migrate:rollback

Puoi trovare maggiori informazioni sulle migrazioni nei documenti


1
Risposta molto completa e pertinente. Grazie!
musicin3d

17

È possibile aggiungere nuove colonne nel Schema::createmetodo iniziale in questo modo:

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

Se hai già creato una tabella, puoi aggiungere ulteriori colonne a quella tabella creando una nuova migrazione e usando il Schema::tablemetodo:

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

La documentazione è abbastanza approfondita al riguardo e non è cambiata troppo dalla versione 3 alla versione 4 .


Qualcosa è sbagliato. Faccio "db: make" per creare un nuovo file di migrazione. E poi ho inserito lo Schema :: table ('utenti', funzione ($ tabella) {$ tabella-> intero ('pagato');}); dentro. Ed esegui "php artisan migrate", ma si verifica un errore irreversibile: impossibile dichiarare nuovamente gli utenti della classe in /Applications/XAMPP/xamppfiles/htdocs/adsense/application/migrations/2013_05_28_122527_users.php sulla riga 3
Kim Larsen,

Dovresti nominare ciascuna delle migrazioni qualcosa di unico quando le crei. In genere il primo a creare ti nomino create_users_table, quindi se sto aggiungendo colonne: add_email_password_columns_to_users.
pianificatore del

sì, come dice evolve, sicuramente è meglio attenersi alle filosofie di progettazione laravel originali e usare solo il " add_" verbo davanti a ciascun file per tenere traccia delle modifiche. in questo modo è più facile tenere traccia delle modifiche per il controllo della versione, ecc. perché viene creato un nuovo file di aggiunta per ogni iterazione. Se sei appena andato e hai continuato a modificare il " create_", sarebbe difficile sapere che x dipendente, aveva incasinato qualcosa rimuovendo un indice, o aggiungendo una nuova colonna ecc. Almeno questo ha senso nella mia testa! :)
cablato il

7

puoi semplicemente modificare il file di migrazione esistente, ad esempio aggiungendo una colonna nella tabella e quindi digitando il terminale:

$ php artisan migrate:refresh

11
Aggiorna svuota la tabella
JohnTaa

8
Questo è incredibilmente pericoloso: se alcune persone eseguono la versione precedente, altre avranno il nuovo e ne conseguirà il caos. In Liquibase, se modifichi un file, fallirà a meno che tu non inserisca esplicitamente eccezioni per consentirlo, e puoi farlo solo in pochissimi casi. Ad esempio, se si rende una colonna non nulla quando alcuni database contengono già dati null, si romperà.
John Little,

3
Sarebbe meglio, se modifichi la tua risposta e dici che svuoterebbe la tua tabella, sarebbe meglio.
Abele,

Nota: questo comando pulirà intere tabelle di database , se si desidera utilizzarlo, quindi
eseguire

5

questo è stato fatto su laravel 5.1.

per prima cosa, sul tuo terminale esegui questo codice

php artisan make:migration add_paid_to_users --table=users

dopodiché vai alla directory del tuo progetto ed espandi il database delle directory - migrazione e modifica del file add_paid_to_users.php, aggiungi questo codice

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

dopodiché torna al tuo terminale ed esegui questo comando

php artisan migrate

spero che questo aiuto.


5

Primo rollback della migrazione precedente

php artisan migrate:rollback

Successivamente, è possibile modificare il file di migrazione esistente (aggiungere nuove, rinominare o eliminare colonne), quindi rieseguire il file di migrazione

php artisan migrate

0

Sebbene un file di migrazione sia la migliore prassi come altri hanno già detto, in un pizzico puoi anche aggiungere una colonna con armeggiare.

$ php artisan tinker

Ecco un esempio di una riga per il terminale:

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



(Qui è formattato per la leggibilità)

Schema::table('users', function(\Illuminate\Database\Schema\Blueprint $table){ 
    $table->integer('paid'); 
});
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.