Buat kolom tidak dapat dinihilkan dalam migrasi Laravel

128

Saya sedang menulis migrasi untuk membuat kolom tertentu dalam tabel nullablesekarang. Untuk fungsi down tentunya saya ingin membuat kolom-kolom tersebut not nullablelagi. Saya telah memeriksa dokumen pembuat skema , tetapi tidak dapat menemukan cara untuk melakukannya.

Bantuan apa pun akan dihargai.

bilalq
sumber
jawaban terlengkap untuk pertanyaan ini dapat ditemukan di sini: stackoverflow.com/a/32568625/4908847
szaman

Jawaban:

232

Sebelum Laravel 5, tidak ada cara asli Laravel untuk mengubah kolom tabel yang sudah ada menggunakan pembuat skema. Anda perlu menggunakan kueri mentah untuk ini.

Namun, pada Laravel 5 Anda dapat menggunakan:

$table->...->nullable(false)->change();
TLGreg
sumber
1
Itulah yang saya temukan juga. Sentuhan yang bagus akan membuat pembuat skema memungkinkan untuk mengubah definisi kolom, yang tampaknya tidak mendukung. Saya yakin ada banyak orang seperti saya yang menggunakan pembuat skema untuk memodifikasi DB yang ada, tidak hanya membuat tabel dari awal.
Sean the Bean
3
Taylor Otwell (pencipta Laravel) berkata 6 hari yang lalu (2014-05-09): "Saya masih mempertahankan pernyataan saya bahwa jika ada yang berhasil dan melakukannya dengan rapi, saya akan menggabungkannya." github.com/laravel/framework/issues/895#issuecomment-42709756
Ryan
3
@Musa Rupanya Anda dapat mengatur kolom nullable (mis .:) $table->string('colmn', 255)->nullable()->change();tetapi sebaliknya tampaknya tidak berfungsi ( $table->string('colmn', 255)->change();), jadi Anda masih perlu menggunakan kueri db mentah untuk ini
Luís Cruz
5
Lihat jawaban @ MattMcDonald di bawah ini. Anda dapat menggunakan nullable () untuk menjadikannya nullable dan nullable (false) untuk menjadikannya Not nullable dalam migrasi.
ajon
5
nullable(false)tidak bekerja untuk saya di Laravel 5.3 :(
Stalinko
38

Pada Laravel 5, dimungkinkan untuk membalikkan ini secara asli - cukup berikan false sebagai argumen ke nullable ().

misalnya

$table -> string('foo') -> nullable(false) -> change();
Matt McDonald
sumber
Berhasil! Jadi ini sudah menjadi jawaban yang benar karena update Laravel.
jlbang
Terima kasih, meskipun saya tidak mengerti mengapa kolom tidak dijadikan non-nullable secara default. Ini biasanya praktik terbaik dan ini menambah banyak gangguan pada kode.
Morgan
1
Kolom bukan nol secara default. Poster itu hanya menanyakan cara membalik kolom yang sudah kosong.
Matt McDonald
2

Jalankan pertama ini:

composer require doctrine/dbal

Kemudian buat migrasi yang akan mengubah tabel seperti ini:

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');
    });
}
funerr
sumber
4
Apakah ada alasan untuk menghapus seluruh kolom dalam rutinitas rollback? Metode down () seharusnya hanya mengurungkan logika metode up () untuk mendukung migrasi bergulir mundur dan maju.
Andrew
1

Anda bisa mendeklarasikan kolom lagi tanpa -> nullable () dan menggunakan -> ubah

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();
    });
}
Gabriel Fernandez
sumber