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.


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.


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 .


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

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.


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


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


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.


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


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.


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.


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

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


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.


0

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

php artisan migrate:rollback --step=5

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.


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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.