Tambahkan kolom baru ke tabel yang ada di migrasi

270

Saya tidak tahu bagaimana cara menambahkan kolom baru ke tabel database saya yang ada menggunakan kerangka Laravel.

Saya mencoba mengedit file migrasi menggunakan ...

<?php

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

Di terminal, saya menjalankan php artisan migrate:installdan migrate.

Bagaimana cara menambahkan kolom baru?

kim larsen
sumber
Akan bermanfaat jika Anda bisa memasukkan kesalahan yang Anda dapatkan; apa yang Anda harapkan terjadi; dan apa yang sebenarnya terjadi?
Phill Sparks
9
Pertanyaan yang bagus Ada banyak dokumentasi migrasi di luar sana, dan itu menunjukkan kepada Anda API dan cara membuat tabel WAKTU PERTAMA. Maka semuanya gagal saat Anda mengembangkan aplikasi lebih banyak dan perlu mengubah struktur db Anda.
Andrew Koper

Jawaban:

611

Untuk membuat migrasi, Anda dapat menggunakan perintah migrasi: make pada Artisan CLI. Gunakan nama tertentu untuk menghindari bentrok dengan model yang ada

untuk Laravel 3:

php artisan migrate:make add_paid_to_users

untuk Laravel 5+:

php artisan make:migration add_paid_to_users_table --table=users

Anda kemudian perlu menggunakan Schema::table()metode ini (saat Anda mengakses tabel yang ada, bukan membuat yang baru). Dan Anda dapat menambahkan kolom seperti ini:

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

dan jangan lupa untuk menambahkan opsi rollback:

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

Kemudian Anda dapat menjalankan migrasi Anda:

php artisan migrate

Ini semua tercakup dalam dokumentasi untuk kedua Laravel 3:

Dan untuk Laravel 4 / Laravel 5:

Edit:

gunakan $table->integer('paid')->after('whichever_column');untuk menambahkan bidang ini setelah kolom tertentu.

Phill Sparks
sumber
3
Justphp artisan migrate
Phill Sparks
Sesuatu yang salah. Saya membuat "db: make" untuk membuat file migrasi baru. Dan kemudian saya meletakkan skema :: table ('users', function ($ table) {$ table-> integer ('paid');}); ke dalamnya. Dan jalankan "php artisan migrate", tetapi dapatkan Fatal error: Tidak dapat mendeklarasikan ulang Pengguna kelas di /Applications/XAMPP/xamppfiles/htdocs/adsense/application/migrations/2013_05_28_122527_users.php pada baris 3
kim larsen
Membuat migrasi juga tercakup dalam dokumentasi. Anda harus memberikannya nama yang lebih spesifik, seperti "add_paid_to_users", dengan cara ini tidak akan berbenturan dengan model bentrokan Anda.
Phill Sparks
Sepertinya setiap URL Laravel 3 doc sedang dialihkan ke Laravel 4 docs. Berikut adalah tautan ke dokumen 3 untuk pembuat skema dan migrasi
6
Pada Laravel 5, perintah ini sekarang adalahphp artisan make:migration add_paid_to_users
mikelovelyuk
64

Saya akan menambahkan jawaban mike3875 untuk pembaca masa depan menggunakan Laravel 5.1 dan seterusnya.

Untuk mempercepat, Anda dapat menggunakan tanda "--table" seperti ini:

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

Ini akan menambahkan konten updan downmetode metode:

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

Demikian pula, Anda dapat menggunakan --create["table_name"]opsi saat membuat migrasi baru yang akan menambah lebih banyak boilerplate untuk migrasi Anda. Poin kecil, tetapi membantu ketika melakukan banyak dari mereka!

camelCase
sumber
2
Itu tidak terjadi di Laravel 5.0, Blueprintditambahkan dalam Laravel 5.1. Hanya satu poin klarifikasi saja.
Phill Sparks
@PhillSparks Anda benar, terima kasih telah menangkap kesalahan saya. Saya telah memperbarui untuk memperjelas versi di mana ini dapat digunakan.
camelCase
24

Jika Anda menggunakan Laravel 5, perintahnya adalah;

php artisan make:migration add_paid_to_users

Semua perintah untuk membuat sesuatu (pengontrol, model, migrasi dll) telah dipindahkan di bawah make:perintah.

php artisan migrate masih sama.

mikelovelyuk
sumber
24

laravel 5.6 ke atas

jika Anda ingin menambahkan kolom baru sebagai KUNCI ASING ke tabel yang ada.

Buat migrasi baru dengan menjalankan perintah ini: make: migrasi

Contoh:

php artisan make:migration add_store_id_to_users_table --table=users

Dalam folder basis data / migrasi Anda memiliki file migrasi baru, seperti:

2018_08_08_093431_add_store_id_to_users_table.php (lihat komentar)

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

Setelah itu jalankan perintah:

php artisan migrate

Jika Anda ingin membatalkan migrasi terakhir karena alasan apa pun, jalankan perintah ini:

php artisan migrate:rollback

Anda dapat menemukan informasi lebih lanjut tentang migrasi di dokumen

dingin
sumber
1
Jawabannya sangat komprehensif dan relevan. Terima kasih!
musicin3d
17

Anda dapat menambahkan kolom baru dalam Schema::createmetode awal seperti ini:

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

Jika Anda sudah membuat tabel, Anda bisa menambahkan kolom tambahan ke tabel itu dengan membuat migrasi baru dan menggunakan Schema::tablemetode:

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

Dokumentasi ini cukup menyeluruh tentang hal ini, dan tidak banyak berubah dari versi 3 ke versi 4 .

pembuat rencana
sumber
Sesuatu yang salah. Saya membuat "db: make" untuk membuat file migrasi baru. Dan kemudian saya meletakkan skema :: table ('users', function ($ table) {$ table-> integer ('paid');}); ke dalamnya. Dan jalankan "php artisan migrate", tetapi dapatkan Fatal error: Tidak dapat mendeklarasikan ulang Pengguna kelas di /Applications/XAMPP/xamppfiles/htdocs/adsense/application/migrations/2013_05_28_122527_users.php pada baris 3
kim larsen
Anda harus memberi nama setiap migrasi sesuatu yang unik saat membuatnya. Biasanya awal membuat saya akan nama create_users_table, maka jika saya menambahkan kolom: add_email_password_columns_to_users.
tplaner
ya seperti kata evolve, tentu lebih baik menggunakan filosofi desain laravel asli dan hanya menggunakan add_kata kerja " " di depan setiap file untuk melacak perubahan. dengan cara ini lebih mudah untuk melacak perubahan untuk kontrol versi dll karena file add baru dibuat untuk setiap iterasi. Jika Anda hanya pergi dan terus memodifikasi " create_" akan sulit untuk mengetahui bahwa x karyawan, telah mengacaukan sesuatu dengan menghapus indeks, atau menambahkan kolom baru dll. Setidaknya itu masuk akal di kepala saya! :)
wired00
7

Anda cukup memodifikasi file migrasi yang ada, misalnya menambahkan kolom di tabel Anda, dan kemudian di terminal Anda mengetik:

$ php artisan migrate:refresh
Mahana Delacour
sumber
11
Refresh akan mengosongkan meja
JohnTaa
8
Ini sangat berbahaya - jika beberapa orang menjalankan versi lama, beberapa akan memiliki versi baru, dan kekacauan akan terjadi. Dalam Liquibase, jika Anda mengedit file, itu akan gagal kecuali Anda secara eksplisit memasukkan pengecualian untuk memperbolehkannya, dan Anda hanya dapat melakukan ini dalam beberapa kasus. Misalnya jika Anda membuat kolom bukan-nol ketika beberapa database sudah memiliki data nol di dalamnya, itu akan rusak.
John Little
3
Akan lebih baik, jika Anda mengedit jawaban Anda dan menyebutkan bahwa itu akan mengosongkan meja Anda, itu akan lebih baik.
Abel
Catatan: Perintah ini akan membersihkan seluruh tabel basis data , jika Anda ingin menggunakannya, maka buat cadangan basis data Anda terlebih dahulu
Udhav Sarvaiya
5

hal ini dikerjakan pada laravel 5.1.

pertama, di terminal Anda jalankan kode ini

php artisan make:migration add_paid_to_users --table=users

setelah itu buka direktori proyek Anda dan perluas basis data direktori - migrasi dan edit file add_paid_to_users.php, tambahkan kode ini

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

setelah itu kembali ke terminal Anda dan jalankan perintah ini

php artisan migrate

semoga ini membantu.

Rosidin Bima
sumber
5

Kembalikan pertama migrasi Anda sebelumnya

php artisan migrate:rollback

Setelah itu, Anda dapat memodifikasi file migrasi yang ada (tambahkan kolom baru, ganti nama atau hapus) kemudian Jalankan Kembali file migrasi Anda

php artisan migrate
noobgrammer
sumber
0

Meskipun file migrasi adalah praktik terbaik seperti yang disebutkan orang lain, dalam keadaan darurat Anda juga dapat menambahkan kolom dengan tinker.

$ php artisan tinker

Berikut ini contoh one-liner untuk terminal:

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



(Ini diformat agar mudah dibaca)

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