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.