Rendi la colonna non annullabile in una migrazione Laravel


128

Sto scrivendo una migrazione per creare determinate colonne in una tabella in nullablequesto momento. Per la funzione down, ovviamente voglio creare di not nullablenuovo quelle colonne . Ho esaminato i documenti del generatore di schemi , ma non sono riuscito a trovare un modo per farlo.

Qualsiasi aiuto sarebbe apprezzato.


la risposta più completa per questa domanda può essere trovato qui: stackoverflow.com/a/32568625/4908847
szaman

Risposte:


232

Prima di Laravel 5 non esisteva un modo nativo di Laravel di modificare una colonna di tabella esistente utilizzando il generatore di schemi. Dovresti usare query non elaborate per questo.

Tuttavia, a partire da Laravel 5 puoi usare:

$table->...->nullable(false)->change();

1
È quello che ho trovato anch'io. Un bel tocco per il generatore di schemi consentirebbe di modificare le definizioni delle colonne, che non sembra supportare. Sono sicuro che ci sono molti altri come me che stanno usando il generatore di schemi per modificare un DB esistente, non solo creando tabelle da zero.
Sean the Bean

3
Taylor Otwell (creatore di Laravel) ha detto 6 giorni fa (2014/05/09): "Rimango ancora fedele alla mia affermazione che se qualcuno può farlo con successo e in modo pulito, lo unirò". github.com/laravel/framework/issues/895#issuecomment-42709756
Ryan

3
@Musa Apparentemente puoi impostare una colonna annullabile (es:) $table->string('colmn', 255)->nullable()->change();ma il contrario non sembra funzionare ( $table->string('colmn', 255)->change();), quindi devi ancora utilizzare query db non elaborate per questo
Luís Cruz

5
Vedi la risposta di @ MattMcDonald di seguito. È possibile usare nullable () per renderlo nullable e nullable (false) per renderlo non annullabile in una migrazione.
ajon

5
nullable(false)non funziona per me a Laravel 5.3 :(
Stalinko

38

A partire da Laravel 5, è possibile invertirlo in modo nativo: è sufficiente passare false come argomento a nullable ().

per esempio

$table -> string('foo') -> nullable(false) -> change();

Funziona! Quindi questa è diventata la risposta corretta a causa degli aggiornamenti a Laravel.
jlbang

Grazie, anche se non capisco perché le colonne non siano rese non annullabili per impostazione predefinita. Di solito è una buona pratica e questo aggiunge molto rumore al codice.
Morgan

1
Le colonne non sono nulle per impostazione predefinita. Il poster chiedeva solo come invertire una colonna già nulla.
Matt McDonald

2

Prima esegui questo:

composer require doctrine/dbal

Quindi crea una migrazione che modificherà la tabella in questo modo:

php artisan make:migration fix_whatever_table_name_here

public function up()
{
    Schema::table('table_name', function (Blueprint $table) {
        $table->type('column')->nullable(false)->change();
    });
}

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

4
C'è un motivo per eliminare l'intera colonna nella routine di rollback? Il metodo down () dovrebbe semplicemente annullare la logica del metodo up () per supportare le migrazioni in sequenza avanti e indietro.
Andrew

1

Puoi semplicemente dichiarare di nuovo la colonna senza -> nullable () e usare -> change

public function up()
{
    Schema::table('table_name', function (Blueprint $table) {
        $table->type('column')->change();
    });
}

public function down()
{
    Schema::table('table_name', function ($table) {
        $table->type('column')->nullable()->change();
    });
}
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.