Laravel'de belirli bir geçişi geri alma


238

İstiyorum

yalnızca geri almak için:

Rolled back: 2015_05_15_195423_alter_table_web_directories


koşarım

php artisan migrate:rollback, 3 göçüm geri dönüyor.

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

Siliyorum

hem benim içinde web_directoriesve benim contactsmasaya istemeden. Bunun olmasını asla istemiyorum ve eğer sadece o özel olanı geri alabilirsem, bu felaket asla olmayacak.


46
upvote! sadece bu soruyu yazdığınız şekilde :)
Sliq

Ben sadece numarayı değişti ve sadece rollbacked yüzden, benim, toplu numarasını değiştirmek izin SQLPro kullanıyorum
rulo

Gelecekteki geri almalar göz önüne alındığında, kullanım 'php esnaf geçirmek --step' Yalnızca geri alma bir göç Eğer php esnaf göçünü çalışacak adım her göç adımı çalıştırmak için: geri alma
James

Yanıtlar:


146

migrationsTablonuza bakarsanız, her taşıma işleminin bir parti numarası olduğunu görürsünüz. Böylece geri döndüğünüzde, son toplu işin parçası olan her geçişi geri alır.

Yalnızca son geçişi geri almak istiyorsanız, toplu iş numarasını bir artırın. rollbackKomutu bir dahaki sefer çalıştırdığınızda, yalnızca kendi taşıma işleminde olduğu gibi bir taşıma işlemini geri alır.


İyi tavsiye! Parti numarasını düzenlemeye çalıştım, izin vermiyor. Bir çeşit kilit ve gri. Bunu Mac'imdeki MySQL WorkBench'te denedim. Bunun hakkında bir fikrin var mı?
cyber8200

Yapılandırmaya çalıştığımda parti numaramın neden kilitlendiğini biliyor musunuz?
cyber8200

1
Taşıma tablosundaki parti numarasını aşağıdaki gibi sorgu ile güncelleyin: UPDATE migrationsSET batch= 2 WHERE migration= 'name_of_the_migration';
Imran Khan

3
@ImranKhan İkiden fazla grubunuz varsa parti numarasını '2' olarak sabit kodlamak özellikle harika değildir.
Martin Bean

Taşıma tablonuzu kolayca düzenlemek ve toplu numaraları değiştirmek için Sequel Pro'yu (yalnızca Mac OS için) kullanın.
Arslan Ramay

271

Laravel 5.3+

Bir adım geri alma. Doğal olarak.

php artisan migrate:rollback --step=1

Ve işte el kitabı sayfası: dokümanlar .


Laravel 5.2 ve öncesi

Biraz uğraşmadan yapmanın yolu yok. Ayrıntılar için Martin Bean'in cevabını kontrol edin .


1
Yine de OP, Laravel'in geliştirme sürümü ile başvurusunu yazmadıkça yararlı değildir.
Martin Bean

4
Bu iyi bir özellik olabilir, ancak geri alınacak taşıma işlemlerinden hangisinin geri alınacağını belirleme işlevi eksiktir . Göçmenler tablosunda listelenen sonuncuyu yaptığını varsayalım? Bir şeyleri taşıdığımda, genellikle geri dönmeyi planlamıyorum , bu yüzden geri almak istediğim göçün son göç olma şansı çok yüksek değil. Görünen o ki laravel bu topu topa düşürdü. Tek bir geçişi geri almanın tek güvenli yolu, geçiş tablosunu el ile düzenlemektir.
Skeets

@ SkeetsO'Reilly Kabul, göçler son derece iyi düşünülmüş değil. Ama buradalar, bu yüzden başlangıçtan itibaren göç paketini aramak zorunda kalmayacaksınız.
Yauheni Prakopchyk

Bir cazibe gibi çalıştı. Yeni bir geçiş (mevcut bir tabloya bir sütun ekleyerek) geliştiriyordum, sonra "uuid" türü ile göç gördüm, "dize" istedim gördüm. Geri alma ipucunuz mükemmel şekilde çalıştı. Geri alma. Kodu güncelleyin. Tekrar taşıyın. =>% 100 tamam. Laravel 5.7
Florian Doyen

(php artisan) komut satırı ile son N geçiş adımımı nasıl getirebilirim. istersem, db ve geçmişimi ve çalışan son geçiş getirmek için benim göç tablo ve sorgu bulmak için arayabilirsiniz. ancak diğer yandan, her zaman taşıma klasörünü kullanamıyorum çünkü yeni taşıma her zaman sıralanmamış. Bu sorun için ben sadece php artisan yapmak kullanmanızı öneririz: geçiş ve bu mevcut dosyaların ortasından geçiş dosyalarının kopyasını kullanmayın.
sabre tabatabaee yazdi

24

Her geri döndüğünüzde, son taşıma grubunu elde edersiniz. komutu kullan

php artisan migrate:rollback --step=1

18

@Martin Bean tarafından söylenenleri yapamıyorsanız, başka bir numara deneyebilirsiniz.

Yeni bir taşıma oluşturun ve bu dosyada yukarı () yönteminde olanları geri almak istediğiniz geçişin down () yönteminde ekleyin ve in () yönteminde olanları aşağı () yönteminde olanları ekleyin.

örneğin, orijinal taşıma işleminiz böyle ise

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

yeni geçiş dosyasında bunu yapın

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

ve taşıma işlemini çalıştırdığınızda tablo silinir. ve tekrar geri istiyorsan sadece geri al.


Cevabınız için teşekkürler, ama ben buna hazırım. Size hızlı bir soru, taşıma tablomun toplu sütununu neden düzenleyemediğimi biliyor musunuz?
cyber8200

1
@ihue biraz geç ama kullanıcı arayüzünü kullanarak bunu düzenleyememenizin nedeni, tablo geçişlerinin birincil anahtarı olmamasıdır. Kendiniz düzenlemek için sql yazmanız gerekir.
Vic

15

daha iyi kullanılmış yenileme geçişi

Refresh komutuna adım seçeneğini sağlayarak sınırlı sayıda taşıma işlemini geri alabilir ve taşıyabilirsiniz. Örneğin, aşağıdaki komut son iki taşıma işlemini geri alır ve yeniden taşır:

php artisan migrate:refresh --step=2

aksi halde kullanılan geri alma göçü

Geri alma komutuna adım seçeneğini sağlayarak sınırlı sayıda taşıma işlemini geri alabilirsiniz. Örneğin, aşağıdaki komut son üç geçişi geri alır:

php artisan migrate:rollback --step=3

taşıma hakkında daha fazla ayrıntı için bkz.


11

En iyi yol, yeni bir taşıma oluşturmak ve bu konuda gerekli değişiklikleri yapmaktır.

En kötü durum geçici çözümü ( DB'ye erişiminiz varsa artı bu tablonun verilerinin RESETİ ile sorun olmaz ):

  1. DB'ye gidin ve geçiş girişini silin / yeniden adlandırın.your-specific-migration
  2. Tarafından oluşturulan tabloyu bırakınyour-specific-migration
  3. Çalıştırmak php artisan migrate --path=/database/migrations/your-specific-migration.php

Bu, Laravel'in göç tarihinde bir giriş olmadığı için laravel'i belirli bir göçü çalıştırmaya zorlayacak

GÜNCELLEME : Laravel yolu (Teşekkürler, @ thiago-valente)

Çalıştırmak:

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

ve sonra:

php artisan migrate

Bu, söz konusu taşımayı yeniden çalıştıracak


4
php artisan migrate:rollback --path=/database/migrations/your-specific-migration.phpSonunda kullandım php artisan migrate
Thiago Valente

8

Bu soruya cevap vermek biraz geç olabilir ama işte bunu yapmanın çok iyi, temiz ve verimli bir yolu olduğunu düşünüyorum. Mümkün olduğunca kapsamlı olmaya çalışacağım.

Taşıma işlemlerinizi oluşturmadan önce aşağıdaki gibi farklı dizinler oluşturun:

    database
       | 
       migrations
            |
            batch_1
            batch_2
            batch_3

Ardından, taşıma işlemlerinizi oluştururken aşağıdaki komutu çalıştırın (tablolarınızı örnek olarak kullanarak):

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

veya

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

veya

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

Yukarıdaki komutlar geçiş dosyasını belirtilen dizin yolu içinde yapar. Ardından, dosyalarınızı atanan dizinleri üzerinden taşımak için aşağıdaki komutu çalıştırabilirsiniz.

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

* Not: batch_1 dosyasını batch_2 veya batch_3 olarak ya da taşıma dosyalarını sakladığınız herhangi bir klasör adını değiştirebilirsiniz. Veritabanı / migrations dizininde veya belirtilen bir dizinde kaldığı sürece.

Ardından, belirli taşıma işlemlerinizi geri almanız gerekirse, aşağıda gösterildiği gibi toplu olarak geri alabilirsiniz:

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

veya

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

veya

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

Bu tekniklerin kullanılması, veritabanlarınız ve şemanızda yapılan değişiklikler üzerinde daha fazla esneklik ve denetime olanak tanır.


Laravel belgeleri yanlış olmadıkça "--step = 3" , sondan 3'e geçişi değil , son 3 geçişi geri alacağı anlamına gelir . Taşımaları farklı klasörlere koymanın bunu değiştirip değiştirmeyeceğini bilmiyorum, ama beklemem. Geri alma adıyla belirtilirse, bu harika olurdu! Ancak, herhangi bir bağımsız değişkeni geri verirseniz, "çok fazla bağımsız değişken" den şikayet eder.
Skeets

4

Bir adım geri alma. Doğal olarak.

php artisan migrate:rollback --step=1

İki adım geri alma. Doğal olarak.

php artisan migrate:rollback --step=2


4

Son geçişi geri almak istiyorsanız.

php artisan migrate:rollback

Belirli taşımayı geri almak istiyorsanız, geçiş tablosuna gidin ve bu kaydın en yüksek değerini toplu olarak ayarlayın. Sonra.

php artisan migrate:rollback

Şu anda başka bir laravel sürümü çalışmıyorsa laravel 5.8 üzerinde çalışıyorum lütfen bana bildirin.


benim için yararlı oldu. Son göç ile tam olarak böyle bir durum.
CodeToLife

3

Tabloları tek tek taşıyın.

Geri almak istediğiniz geçişin toplu iş numarasını en yüksek değere değiştirin.

Migrate: rollback komutunu çalıştırın.

Büyük projelerle başa çıkmanın en rahat yolu olmayabilir.


3

Orijinal taşıma dosyasını değiştirmek ve yeniden taşımak istiyorsanız, taşımak için bu paketi kullanabilirsiniz. ( Laravel 5.4 veya üzeri için geçerlidir)

İlk olarak, Laravel projenize paketi yükleyin:

composer require caloskao/migrate-specific

Komutu şurada kaydet app/Console/Kernel.php:

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

Şimdi dosyanızı taşımak için bu komutu çalıştırın

php artisan migrate:specific database/migrations/table.php

Bunu kullanarak elde edilebilir php artisan:migrate --path=database/migrations/my_migration.php. Bunu yapmadan hemen önce, migrationstablonun bir girişi olmadığından emin olun my_migration.
Aleksandar

1
INSERT INTO homestead.bb_migrations (`migration`, `batch`)  VALUES ('2016_01_21_064436_create_victory_point_balance_table', '2')

böyle bir şey


1

1.) Veritabanının içinde, taşıma tablosuna gidin ve bırakmak istediğiniz tabloyla ilgili taşıma girişini silin.

Taşıma tablosu resmi örneği

2.) Ardından, talimat 1'den yeni sildiğiniz taşıma işlemiyle ilgili tabloyu silin.

Tablo resmi örneğini sil

3.) Son olarak, talimat no. 'Dan sildiğiniz tablonun taşıma dosyasında istediğiniz değişiklikleri yapın. 2 sonra php artisan migratetabloyu yeniden taşımak için çalıştırın .


0

Laravel kılavuzunda belirtildiği gibi , --stepseçeneği kullanarak belirli sayıda taşıma işlemini geri alabilirsiniz

php artisan migrate:rollback --step=5

sadece Laravel 5.3, yani bu sürümün altında kodlanan hiçbir şey onu kullanamaz
Jeffz

Bu OP'nin durumunda yardımcı olmaz, çünkü belirli bir taşıma işlemini değil, belirli sayıda taşıma işlemini geri alır. "--step3" yine de 3 taşımayı geri alır.
Skeets

0

Bunu aynı geçiş (ler) ile birkaç kez yapmanız gerekiyorsa, bahsedilenlerden başka bir alternatif. Şahsen bunun göçlerinize çok fazla esneklik kattığını düşünüyorum.

Otomatik database/migrationsyükleme nesnenize şu şekilde ekleyin composer.json:

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

Ardından namespace Database\Migrations;tüm taşıma dosyalarınıza ekleyin .

Ardından dosyanızı $ composer dump-autoloadyenilemek için çalıştırın composer.lock.

Ardından, taşıma için sınıf adınızın olduğu varsayılırsa AlterTableWebDirectories, aşağıdaki gibi bir komut oluşturabilirsiniz:

$ php artisan make:command DropAlterTableWebDirectories

Ve bu mantığı handle()yönteminize yazın:

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

Bu tam olarak ne istediğinizi yapacak. Taşıma sayısını silmek yerine azaltmak istiyorsanız, büyük olasılıklaDB:raw komutu .

Bu komut, komuta argüman ileterek hangi taşımayı bıraktığınızı dinamik olarak seçmenize izin vermek için genişletilebilir.

Sonra bu dosyayı tekrar taşımak için okurken, php artisan migrate ve taşıyacaktır.

Bu işlem, her seferinde tam bir yenileme ve tohumlama yapmak zorunda kalmadan taşıma işlemlerinde belirli değişiklikler yapmanızı sağlar.

Şahsen bunu çok yapmam gerekiyor çünkü tohumlarım oldukça büyük.


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

0

DB'ye erişiminiz varsa daha kolay bir çözüme sahipsiniz. Kaydı taşıma tablosundan silebilir ve ardından tabloyu bırakabilirsiniz. SQL istemcisi ile.

Ve kullanabilirsiniz

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

Birçok cevap gibi. Ve yolun Konum olduğunu unutmayın. Modül geçişini bile bu şekilde kaldırabilirsiniz. (Herhangi bir paylaşımdan herhangi bir geçiş)

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

Unutmayın, Linux sunucularını büyük / küçük harfe duyarlılık konusunda dikkatli kullanıyorsanız. Başlangıç ​​sermayesi ile like / Database / Migrations eklemelisiniz .

/Database/Migrations/2020_05_15_xxxxxx_create_your_table.php
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.