Kembalikan satu migrasi spesifik di Laravel

238

saya ingin

untuk mengembalikan saja:

Rolled back: 2015_05_15_195423_alter_table_web_directories


saya berlari

php artisan migrate:rollback, 3 migrasi saya bergulir kembali.

Rolled back: 2015_05_15_195423_alter_table_web_directories
Rolled back: 2015_05_13_135240_create_web_directories_table
Rolled back: 2015_05_13_134411_create_contacts_table

saya hapus

baik meja web_directoriessaya maupun contactsmeja saya secara tidak sengaja. Saya tidak pernah ingin itu terjadi, dan jika saya hanya bisa mengembalikan yang spesifik, bencana ini tidak akan pernah terjadi.

cyber8200
sumber
46
menang! hanya untuk cara Anda menulis pertanyaan ini :)
Sliq
Saya menggunakan sqlpro, itu biarkan saya mengubah nomor batch, jadi saya hanya mengubah nomor dan hanya rollback
roll
Mempertimbangkan rollback masa depan, gunakan 'php artisan migrate --step' untuk menjalankan setiap migrasi langkah demi langkah yang hanya akan mengembalikan satu migrasi ketika Anda menjalankan php artisan migrate: rollback
James

Jawaban:

146

Jika Anda melihat di migrationstabel Anda , maka Anda akan melihat setiap migrasi memiliki nomor batch. Jadi ketika Anda memutar kembali, itu memutar kembali setiap migrasi yang merupakan bagian dari kumpulan terakhir.

Jika Anda hanya ingin mengembalikan migrasi terakhir, maka tambahkan nomor batch satu per satu. Kemudian lain kali Anda menjalankan rollbackperintah, itu hanya akan mengembalikan migrasi yang satu itu karena itu dalam "batch" sendiri.

Martin Bean
sumber
Rekomendasi bagus! Saya mencoba mengedit nomor batch, itu tidak akan membiarkan saya. Ini semacam kunci, dan abu-abu. Saya mencobanya di MySQL WorkBench di Mac saya. Ada ide tentang itu?
cyber8200
Tahukah Anda mengapa, nomor batch saya terkunci ketika saya mencoba mengonfigurasinya?
cyber8200
1
Perbarui nomor kumpulan dalam tabel migrasi dengan kueri seperti: migrationsSET UPDATE batch= 2 WHERE migration= 'name_of_the_migration';
Imran Khan
3
@ImranKhan Hard-coding nomor batch ke '2' tidak terlalu bagus jika Anda memiliki lebih dari dua batch.
Martin Bean
Gunakan Sequel Pro (hanya untuk Mac OS) untuk mengedit tabel Migrasi Anda dengan mudah dan mengubah nomor batch.
Arslan Ramay
271

Laravel 5.3+

Kembalikan satu langkah. Secara asli.

php artisan migrate:rollback --step=1

Dan ini halaman manualnya: docs .


Laravel 5.2 dan sebelumnya

Tidak ada cara untuk melakukan tanpa kerumitan. Untuk detailnya, periksa jawaban Martin Bean .

Yauheni Prakopchyk
sumber
1
Tidak berguna kecuali OP telah menulis aplikasinya dengan Laravel versi pengembangan.
Martin Bean
4
Ini akan menjadi fitur yang baik, tapi itu hilang fungsi untuk menentukan mana dari migrasi ke rollback. Saya menganggap itu hanya yang terakhir yang tercantum dalam tabel migrasi? Ketika saya bermigrasi, saya biasanya tidak berencana untuk mundur, sehingga peluang migrasi yang ingin saya kembalikan menjadi migrasi terakhir tidak terlalu tinggi. Sepertinya jenis bola menjatuhkan bola yang satu ini. Satu-satunya cara aman untuk mengembalikan satu migrasi adalah dengan mengedit tabel migrasi secara manual.
Skeets
@ SkeetsO'Reilly Setuju, migrasi tidak dipikirkan dengan baik. Tetapi mereka ada di sini sehingga Anda tidak akan dipaksa untuk mencari paket migrasi sejak awal.
Yauheni Prakopchyk
Itu bekerja seperti pesona. Saya sedang mengembangkan migrasi baru (menambahkan kolom ke tabel yang ada), kemudian saya melihat saya bermigrasi dengan tipe "uuid", saya ingin "string". Tip kemunduran Anda berfungsi dengan baik. Kembalikan. Perbarui kode. Bermigrasi lagi. => 100% ok. Laravel 5.7
Florian Doyen
bagaimana saya bisa mengambil langkah migrasi N terakhir saya dengan baris perintah (php artisan). jika saya mau, saya bisa mencari ke db dan menemukan tabel migrasi saya dan permintaan untuk mengambil riwayat saya dan migrasi terakhir saya yang berjalan. tetapi di sisi lain, saya tidak bisa selalu menggunakan folder migrasi saya karena migrasi baru tidak selalu diurutkan. untuk masalah ini saya hanya menyarankan agar kita menggunakan php artisan make: migrasi dan jangan gunakan salinan file migrasi dari tengah file-file yang ada.
saber tabatabaee yazdi
24

Setiap kali Anda mengembalikan, Anda mendapatkan kumpulan migrasi terakhir. gunakan perintah

php artisan migrate:rollback --step=1
PAUL KIARIE
sumber
18

Jika Anda tidak dapat melakukan apa yang diperintahkan oleh @Martin Bean, maka Anda dapat mencoba trik lain.

Buat migrasi baru dan pada file itu di atas () metode memasukkan apa yang ada di bawah () metode migrasi yang Anda ingin kembalikan dan di bawah () metode memasukkan apa yang ada di atas () metode.

mis. jika migrasi asli Anda seperti ini

public function up()
{
    Schema::create('users', function(Blueprint $table)
    {
        $table->increments('id')->unsigned();
        $table->string('name');
    });
}
public function down()
{
    Schema::drop('users');
}

maka dalam file migrasi baru lakukan ini

public function up()
{
    Schema::drop('users');
}
public function down()
{
    Schema::create('users', function(Blueprint $table)
    {
        $table->increments('id')->unsigned();
        $table->string('name');
    });
}

dan kemudian jalankan migrasi, itu akan menghapus tabel. dan jika Anda menginginkannya kembali, kembalikan saja.

Nehal Hasnayeen
sumber
Terima kasih atas jawaban Anda, tapi saya siap dengan ini. Pertanyaan singkat untuk Anda, tahukah Anda mengapa saya tidak dapat mengedit kolom kumpulan tabel migrasi saya?
cyber8200
1
@ agak terlambat, tetapi alasan Anda tidak dapat mengeditnya menggunakan UI adalah karena migrasi tabel tidak memiliki kunci utama. Anda harus menulis sql untuk mengeditnya sendiri.
Vic
15

lebih baik menggunakan refresh migrasi

Anda dapat mengembalikan & memigrasi ulang sejumlah migrasi dengan memberikan opsi langkah ke perintah penyegaran. Misalnya, perintah berikut akan mengembalikan & memigrasi ulang dua migrasi terakhir:

php artisan migrate:refresh --step=2

jika tidak, gunakan rollback migrasi

Anda dapat mengembalikan sejumlah migrasi dengan menyediakan opsi langkah ke perintah rollback. Misalnya, perintah berikut akan mengembalikan tiga migrasi terakhir:

php artisan migrate:rollback --step=3

untuk detail lebih lanjut tentang migrasi, lihat

Jignesh Joisar
sumber
11

Cara terbaik adalah membuat migrasi baru dan membuat perubahan yang diperlukan di dalamnya.

Penanganan kasus terburuk ( jika Anda memiliki akses ke DB plus Anda setuju dengan RESET dari data tabel itu ):

  1. Buka DB dan hapus / ganti nama entri migrasi untukyour-specific-migration
  2. Letakkan tabel yang dibuat olehyour-specific-migration
  3. Lari php artisan migrate --path=/database/migrations/your-specific-migration.php

Ini akan memaksa laravel untuk menjalankan migrasi spesifik itu karena tidak ada entri tentang itu ada dalam riwayat migrasi Laravel

PEMBARUAN : Cara Laravel (Terima kasih, @ thiago-valente)

Lari:

php artisan migrate:rollback --path=/database/migrations/your-specific-migration.php

lalu:

php artisan migrate

Ini akan menjalankan kembali migrasi tertentu

Deepak Thomas
sumber
4
Saya telah menggunakan php artisan migrate:rollback --path=/database/migrations/your-specific-migration.phpDan akhirnya php artisan migrate
Thiago Valente
8

Mungkin agak terlambat untuk menjawab pertanyaan ini, tetapi ini cara yang sangat bagus, bersih dan efisien untuk melakukannya. Saya akan berusaha selengkap mungkin.

Sebelum membuat migrasi Anda, buat direktori yang berbeda seperti:

    database
       | 
       migrations
            |
            batch_1
            batch_2
            batch_3

Kemudian, ketika membuat migrasi Anda, jalankan perintah berikut (menggunakan tabel Anda sebagai contoh):

     php artisan make:migration alter_table_web_directories --path=database/migrations/batch_1

atau

     php artisan make:migration alter_table_web_directories --path=database/migrations/batch_2

atau

     php artisan make:migration alter_table_web_directories --path=database/migrations/batch_3

Perintah di atas akan membuat file migrasi di dalam jalur direktori yang diberikan. Kemudian Anda cukup menjalankan perintah berikut untuk memigrasi file Anda melalui direktori yang ditentukan.

    php artisan migrate alter_table_web_directories --path=database/migrations/batch_1

* Catatan: Anda dapat mengubah batch_1 menjadi batch_2 atau batch_3 atau apa pun nama folder tempat Anda menyimpan file migrasi tersebut. Asalkan tetap berada di dalam basis data / migrasi direktori atau direktori tertentu.

Selanjutnya jika Anda ingin mengembalikan migrasi spesifik Anda, Anda dapat mengembalikan secara batch seperti yang ditunjukkan di bawah ini:

    php artisan migrate:rollback --step=1
                    or try
php artisan migrate:rollback alter_table_web_directories --path=database/migrations/batch_1

atau

    php artisan migrate:rollback --step=2
                    or try
php artisan migrate:rollback alter_table_web_directories --path=database/migrations/batch_2

atau

    php artisan migrate:rollback --step=3
                    or try
php artisan migrate:rollback alter_table_web_directories --path=database/migrations/batch_3

Menggunakan teknik-teknik ini akan memungkinkan Anda lebih banyak fleksibilitas dan kontrol atas database Anda dan setiap modifikasi yang dibuat untuk skema Anda.

Andre F.
sumber
Kecuali dokumentasi laravel salah, "--step = 3" berarti ini akan mengembalikan 3 migrasi terakhir , bukan yang ketiga yang menjalankan migrasi terakhir. Saya tidak tahu apakah menempatkan migrasi di folder yang berbeda akan mengubah itu sama sekali, tetapi saya tidak akan mengharapkannya. Jika menentukan kemunduran dengan nama berhasil, itu akan bagus! Namun, jika Anda memberikan rollback argumen apa pun, itu mengeluh "terlalu banyak argumen".
Skeets
4

Kembalikan satu langkah. Secara asli.

php artisan migrate:rollback --step=1

Kembalikan dua langkah. Secara asli.

php artisan migrate:rollback --step=2
Kharecha parth
sumber
4

Jika Anda ingin mengembalikan migrasi terakhir.

php artisan migrate:rollback

Jika Anda ingin mengembalikan migrasi tertentu kemudian pergi ke tabel migrasi dan atur nilai tertinggi dari catatan itu dalam batch. Kemudian.

php artisan migrate:rollback

Saat ini saya sedang mengerjakan laravel 5.8 jika tidak bekerja versi laravel lainnya, mohon informasikan kepada saya.

Raghu Aryan
sumber
berguna bagi saya. Seperti halnya dengan migrasi terakhir.
CodeToLife
3

Bermigrasi tabel satu per satu.

Ubah nomor batch migrasi yang ingin Anda kembalikan ke tertinggi.

Jalankan migrasi: kembalikan.

Mungkin bukan cara yang paling nyaman untuk berurusan dengan proyek yang lebih besar.

Jeffz
sumber
3

Jika Anda ingin memodifikasi file migrasi asli dan memigrasikannya kembali, Anda dapat menggunakan paket ini untuk bermigrasi. (Berlaku untuk Laravel 5.4 atau lebih baru)

Pertama, instal paket di proyek Laravel Anda:

composer require caloskao/migrate-specific

Daftarkan perintah di app/Console/Kernel.php:

protected $commands = [
    \CalosKao\MigrateSpecific::class
];

Sekarang, jalankan perintah ini untuk memigrasi file Anda

php artisan migrate:specific database/migrations/table.php
Calo
sumber
Ini bisa dicapai dengan menggunakan php artisan:migrate --path=database/migrations/my_migration.php. Tepat sebelum Anda melakukannya, pastikan migrationstabel tidak memiliki entri untuk my_migration.
Aleksandar
1
INSERT INTO homestead.bb_migrations (`migration`, `batch`)  VALUES ('2016_01_21_064436_create_victory_point_balance_table', '2')

sesuatu seperti ini

Harry Bosh
sumber
1

1.) Di dalam database, buka tabel migrasi dan hapus entri migrasi yang terkait dengan tabel yang ingin Anda jatuhkan.

Contoh gambar tabel migrasi

2.) Selanjutnya, hapus tabel yang terkait dengan migrasi yang baru saja Anda hapus dari instruksi 1.

Hapus contoh gambar tabel

3.) Akhirnya, lakukan perubahan yang Anda inginkan ke file migrasi dari tabel yang Anda hapus dari instruksi no. 2 kemudian jalankan php artisan migrateuntuk memigrasi tabel lagi.

Kidali Kevin
sumber
0

Seperti yang dinyatakan dalam manual Laravel , Anda dapat mengembalikan jumlah migrasi tertentu menggunakan --stepopsi

php artisan migrate:rollback --step=5
Slav Levin
sumber
hanya Laravel 5.3, jadi apa pun yang diberi kode di bawah versi itu tidak dapat menggunakannya
Jeffz
Ini tidak akan membantu dalam kasus OP, karena itu akan mengembalikan sejumlah migrasi, bukan migrasi tertentu. "--step3" masih akan mengembalikan 3 migrasi.
Skeets
0

Alternatif lain dari yang disebutkan jika Anda perlu melakukan ini beberapa kali dengan migrasi yang sama. Secara pribadi saya pikir ini menambah banyak fleksibilitas untuk migrasi Anda.

Tambahkan database/migrationske objek autoload Anda di composer.jsonseperti ini:

"autoload": {
        "psr-4": {
            "App\\": "app/"
        },
        "classmap": [
            "database/seeds",
            "database/factories",
            "database/support",
            "database/migrations" // add this line
        ]
    },

Kemudian tambahkan namespace Database\Migrations;ke semua file migrasi Anda.

Kemudian jalankan $ composer dump-autoloaduntuk menyegarkan composer.lockfile Anda .

Kemudian, dengan asumsi nama kelas Anda untuk migrasi adalah AlterTableWebDirectories, Anda bisa membuat perintah seperti ini:

$ php artisan make:command DropAlterTableWebDirectories

Dan tuliskan logika ini dalam handle()metode Anda :

public function handle {
   (new AlterTableWebDirectories)->down();
   DB::raw("delete from migrations where migration like '%alter_table_web_directories%'");
}

Ini akan melakukan apa yang Anda inginkan. Jika Anda ingin mengurangi jumlah migrasi alih-alih menghapusnya, Anda mungkin dapat mengetahui cara mengubah DB:rawperintah.

Perintah ini dapat diperluas untuk memungkinkan Anda memilih migrasi mana yang Anda buang secara dinamis dengan mengirimkan argumen ke dalam perintah.

Kemudian ketika Anda membaca untuk memigrasi file itu lagi, Anda bisa menjalankannya php artisan migratedan hanya akan memigrasikan file itu.

Proses ini memungkinkan Anda untuk membuat perubahan spesifik pada migrasi tanpa harus melakukan penyegaran penuh dan seed setiap kali.

Secara pribadi saya perlu melakukan itu banyak karena benih saya agak besar.

willsmanley
sumber
0
php artisan migrate:rollback --path=/database/migrations/0000_00_00_0000_create_something_table.php
Dacod
sumber
0

Jika Anda memiliki akses ke DB, Anda memiliki solusi yang lebih mudah. Anda dapat menghapus catatan dari tabel migrasi dan kemudian cukup letakkan tabel. dengan klien SQL.

Dan bisa digunakan

php artisan migrate:rollback --path=... 

Suka banyak jawaban. Dan ingat jalannya adalah Lokasi. Anda bahkan dapat menghapus migrasi modul seperti ini. (Setiap migrasi dari anywhare)

php artisan migrate:rollback --path=Modules/YourModule/database/migrations/2020_05_15_xxxxxx_create_your_table.php

Dan ingat, Jika Anda menggunakan server linux berhati-hati tentang sensitivitas huruf. Anda harus menambahkan seperti / Database / Migrasi dengan modal awal.

/Database/Migrations/2020_05_15_xxxxxx_create_your_table.php
Aruna Perera
sumber