Taşıma işlemindeki mevcut tabloya yeni bir sütun ekleme


270

Laravel çerçevesini kullanarak mevcut veritabanı tabloma nasıl yeni bir sütun ekleyeceğimi anlayamıyorum.

Geçiş dosyasını kullanarak düzenlemeye çalıştım ...

<?php

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

Terminal, ben yürütmek php artisan migrate:installve migrate.

Nasıl yeni sütun eklerim?


Aldığınız hataları ekleyebilmeniz yararlı olacaktır; ne olmasını bekliyorsun; ve gerçekte ne olur?
Phill Kıvılcım

9
Harika bir soru. Orada bir sürü geçiş belgesi var ve API'yı ve İLK KEZ tablolarını nasıl oluşturacağınızı gösteriyor. Uygulamanızı daha fazla geliştirdiğinizde ve db yapınızı değiştirmeniz gerektiğinde, hepsi başarısız olur.
Andrew Koper

Yanıtlar:


611

Geçiş oluşturmak için Artisan CLI'da migrate: make komutunu kullanabilirsiniz. Mevcut modellerle çakışmadan kaçınmak için belirli bir ad kullanın

Laravel 3 için:

php artisan migrate:make add_paid_to_users

Laravel 5+ için:

php artisan make:migration add_paid_to_users_table --table=users

Daha sonra Schema::table()yöntemi kullanmanız gerekir (yeni bir tablo oluşturmak yerine mevcut bir tabloya erişirken). Ve bunun gibi bir sütun ekleyebilirsiniz:

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

ve geri alma seçeneğini eklemeyi unutmayın:

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

Ardından taşıma işlemlerinizi yürütebilirsiniz:

php artisan migrate

Bunların her ikisi de Laravel 3'ün belgelerinde iyi bir şekilde ele alınmıştır:

Laravel 4 / Laravel 5 için:

Düzenle:

$table->integer('paid')->after('whichever_column');bu sütunu belirli bir sütundan sonra eklemek için kullanın .


3
Justphp artisan migrate
Phill Kıvılcım

Bir şey yanlış. Yeni bir geçiş dosyası yapmak için "db: make" yapıyorum. Ve sonra Schema :: table ('users', function ($ table) {$ table-> integer ('paid');}); bunun içine. Ve "php esnaf migrate" çalıştırabilir, ancak önemli hata alıyorum: Can 3. hatta /Applications/XAMPP/xamppfiles/htdocs/adsense/application/migrations/2013_05_28_122527_users.php değil redeclare sınıf Kullanıcılar
Kim Larsen

Taşıma oluşturma belgeleri de kapsanmaktadır. "Add_paid_to_users" gibi daha spesifik bir ad vermelisiniz, bu şekilde model çakışmanızla çakışmaz.
Phill Kıvılcım

Görünüşe göre herhangi bir Laravel 3 doküman URL'si Laravel 4 dokümanlarına yönlendiriliyor. İşte şema oluşturucu ve geçişler

6
Laravel 5 itibariyle, bu komut şimdiphp artisan make:migration add_paid_to_users
mikelovelyuk

64

Laravel 5.1 ve sonraki sürümlerini kullanarak gelecekteki okuyucular için mike3875'in cevabını ekleyeceğim.

İşleri daha hızlı yapmak için "--table" bayrağını şu şekilde kullanabilirsiniz:

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

Bu, upve downyöntem içeriğini otomatik olarak ekler :

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

Benzer şekilde, --create["table_name"]yeni taşıma işlemleri oluştururken, taşımalarınıza daha fazla kaynak plakası ekleyecek olan seçeneği kullanabilirsiniz . Küçük nokta, ama bir sürü yaparken yararlı!


2
Laravel 5.0'da durum böyle değildi, BlueprintLaravel 5.1'e eklendi. Sadece bir açıklama noktası bu.
Phill Kıvılcım

@PhillSparks Haklısın, hatayı yakaladığın için teşekkür ederim. Bunun kullanılabileceği sürümü netleştirmek için güncelledim.
camelCase

24

Laravel 5 kullanıyorsanız, komut;

php artisan make:migration add_paid_to_users

Bir şeyler yapmak için tüm komutlar (kontrolörler, modeller, geçişler vb.) make:Komutun altına taşındı .

php artisan migrate yine de aynı.


24

laravel 5.6 ve üstü

mevcut bir tabloya YABANCI ANAHTARI olarak yeni sütun eklemek istemeniz durumunda.

Bu komutu yürüterek yeni bir taşıma oluşturun: make: migration

Misal :

php artisan make:migration add_store_id_to_users_table --table=users

Veritabanı / taşıma klasöründe yeni bir taşıma dosyanız var:

2018_08_08_093431_add_store_id_to_users_table.php (yorumlara bakın)

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

Bundan sonra komutu çalıştırın:

php artisan migrate

Herhangi bir nedenle son geçişi geri almak istiyorsanız, şu komutu çalıştırın:

php artisan migrate:rollback

Taşımalarla ilgili daha fazla bilgiyi dokümanlarda bulabilirsiniz


1
Çok kapsamlı ve ilgili bir cevap. Teşekkürler!
musicin3d

17

İlk Schema::createyöntemde şöyle yeni sütunlar ekleyebilirsiniz :

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

Zaten bir tablo oluşturduysanız, yeni bir taşıma oluşturarak ve Schema::tableyöntemi kullanarak bu tabloya ek sütunlar ekleyebilirsiniz :

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

Dokümantasyon bu konuda oldukça kapsamlı olduğunu ve çok fazla değişmedi sürüm 3 için sürüm 4 .


Bir şey yanlış. Yeni bir geçiş dosyası yapmak için "db: make" yapıyorum. Ve sonra Schema :: table ('users', function ($ table) {$ table-> integer ('paid');}); bunun içine. Ve "php esnaf migrate" çalıştırabilir, ancak önemli hata alıyorum: Can 3. hatta /Applications/XAMPP/xamppfiles/htdocs/adsense/application/migrations/2013_05_28_122527_users.php değil redeclare sınıf Kullanıcılar
Kim Larsen

Her taşıma işlemini oluştururken benzersiz bir ad vermelisiniz. Tipik başlangıç ben adını vereceğiz oluşturmak create_users_tableBen sütun ekleme ediyorsam, sonra: add_email_password_columns_to_users.
tplaner

evet geliştiği gibi, kesinlikle orijinal laravel tasarım felsefelerine sadık kalmak ve add_değişiklikleri izlemek için her dosyanın önündeki " " fiilini kullanmak daha iyidir . Bu şekilde, her yineleme için yeni bir ekleme dosyası oluşturulduğu için sürüm kontrolü vb. değişiklikleri izlemek daha kolaydır. Sadece gittiniz ve " create_" değiştirmeye devam ederseniz , x çalışanının, bir dizini kaldırarak veya yeni bir sütun vb. Ekleyerek en azından kafamda mantıklı bir şey eklediğini bilmek zor olurdu! :)
wired00

7

mevcut taşıma dosyanızı basitçe değiştirebilirsiniz; örneğin, tablonuza bir sütun eklemek ve daha sonra terminal yazmanızda:

$ php artisan migrate:refresh

11
Yenileme tabloyu
boşaltacak

8
Bu inanılmaz derecede tehlikelidir - bazı insanlar eski sürümü çalıştırırsa, bazıları yeniye sahip olacak ve kaos ortaya çıkacaktır. Liquibase'de, bir dosyayı düzenlerseniz, izin vermek için açıkça istisnalar eklemediğiniz sürece başarısız olur ve bunu yalnızca çok az durumda yapabilirsiniz. Örneğin, bazı veritabanlarında zaten boş veri olduğunda bir sütunu boş bırakmazsanız kırılır.
John Little

3
Daha iyi olurdu, cevabınızı düzenler ve tablonuzu boşaltacağından bahsederseniz, daha iyi olur.
Abel

Not: Bu komut, tüm veritabanı tablolarını temizleyecektir , eğer kullanmak istiyorsanız, önce veritabanınızı yedekleyin
Udhav Sarvaiya

5

bu şeyler laravel 5.1 üzerinde çalışıyor.

önce terminalinizde bu kodu yürütün

php artisan make:migration add_paid_to_users --table=users

Bundan sonra proje dizininize gidin ve dizin veritabanını genişletin - taşıma ve düzenleme dosyası add_paid_to_users.php, bu kodu ekleyin

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

Bundan sonra terminalinize geri dönün ve bu komutu yürütün

php artisan migrate

umarım bu yardım.


5

İlk olarak önceki taşımanızı geri alın

php artisan migrate:rollback

Bundan sonra, mevcut taşıma dosyanızı değiştirebilir (yeni ekleme, sütunları yeniden adlandırma veya silme) ve ardından taşıma dosyanızı yeniden çalıştırma

php artisan migrate

0

Bir taşıma dosyası diğerlerinin de belirttiği gibi en iyi uygulama olsa da, bir tutamda tamircilikle bir sütun da ekleyebilirsiniz.

$ php artisan tinker

Terminal için örnek bir astar:

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



(Burada okunabilirlik için biçimlendirilmiştir)

Schema::table('users', function(\Illuminate\Database\Schema\Blueprint $table){ 
    $table->integer('paid'); 
});
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.