移行で既存のテーブルに新しい列を追加する


270

Laravelフレームワークを使用して、既存のデータベーステーブルに新しい列を追加する方法がわかりません。

私は使用して移行ファイルを編集しようとしました...

<?php

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

ターミナルでは、とを実行php artisan migrate:installmigrateます。

新しい列を追加するにはどうすればよいですか?


発生しているエラーを含めることができれば便利です。何が起こると思いますか。そして実際に何が起こりますか?
Phill Sparks 2013

9
すばらしい質問です。そこには多くの移行ドキュメントがあり、APIと最初にテーブルを作成する方法を示しています。その後、アプリをさらに開発し、db構造を変更する必要があるため、すべてが失敗します。
Andrew Koper 2016

回答:


611

マイグレーションを作成するには、Artisan CLIでmigrate:makeコマンドを使用できます。特定の名前を使用して、既存のモデルとの衝突を回避します

Laravel 3の場合:

php artisan migrate:make add_paid_to_users

Laravel 5+の場合:

php artisan make:migration add_paid_to_users_table --table=users

次に、Schema::table()メソッドを使用する必要があります(新しいテーブルを作成するのではなく、既存のテーブルにアクセスするため)。また、次のような列を追加できます。

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

そして、ロールバックオプションを追加することを忘れないでください:

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

次に、移行を実行できます。

php artisan migrate

これは両方のLaravel 3のドキュメントですべてカバーされています。

Laravel 4 / Laravel 5の場合:

編集:

$table->integer('paid')->after('whichever_column');特定の列の後にこのフィールドを追加するために使用します。


3
Justphp artisan migrate
Phill Sparks 2013

何かが間違っている。"db:make"を作成して、新しい移行ファイルを作成します。次に、Schema :: table( 'users'、function($ table){$ table-> integer( 'paid');});を配置します。その中に。そして、「php artisan migrate」を実行しますが、致命的なエラーが発生します:
/Applications/XAMPP/xamppfiles/htdocs/adsense/application/migrations/2013_05_28_122527_users.phpの

マイグレーションの作成についてもドキュメントで説明されています。「add_paid_to_users」のように、より具体的な名前を付ける必要があります。これにより、モデルの衝突と衝突しなくなります。
Phill Sparks 2013

Laravel 3ドキュメントのURLがLaravel 4ドキュメントにリダイレクトされているようです。ここでは3ドキュメントへのリンクですスキーマビルダー移行

6
Laravel 5以降、このコマンドは次のようになりますphp artisan make:migration add_paid_to_users
mikelovelyuk 2015

64

Laravel 5.1以降を使用する将来の読者のために、mike3875の回答を追加します。

より速くするために、次のようにフラグ「--table」を使用できます。

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

これにより、upおよびdownメソッドのコンテンツが自動的に追加されます。

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

同様に、--create["table_name"]新しい移行を作成するときに、移行にボイラープレートを追加するオプションを使用できます。小さなポイントですが、それらをロードするときに役立ちます!


2
Laravel 5.0ではそうではなく、BlueprintLaravel 5.1で追加されました。明確化のポイントはすべてです。
Phill Sparks

@PhillSparksそうです、私の間違いを見つけてくれてありがとう。これを使用できるバージョンを明確にするために更新しました。
camelCase 2016

24

Laravel 5を使用している場合、コマンドは次のようになります。

php artisan make:migration add_paid_to_users

ものを作るためのすべてのコマンド(コントローラー、モデル、移行など)は、make:コマンドの下に移動されました。

php artisan migrate まだ同じです。


24

laravel 5.6以降

新しい列を外部キーとして既存のテーブルに追加する場合。

次のコマンドを実行して、新しいマイグレーションを作成します:make:migration

例:

php artisan make:migration add_store_id_to_users_table --table=users

database / migrationsフォルダーには、次のような新しい移行ファイルがあります。

2018_08_08_093431_add_store_id_to_users_table.php(コメントを参照)

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

その後、次のコマンドを実行します。

php artisan migrate

何らかの理由で最後の移行を取り消す場合は、次のコマンドを実行します。

php artisan migrate:rollback

移行の詳細については、ドキュメントをご覧ください


1
非常に包括的で適切な答え。ありがとう!
musicin3d

17

次のSchema::createように、初期メソッド内に新しい列を追加できます。

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

すでにテーブルを作成している場合は、新しい移行を作成し、Schema::tableメソッドを使用して、そのテーブルに列を追加できます。

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

ドキュメントはこれについてかなり詳細であり、バージョン3からバージョン4にあまり変更されていません。


何かが間違っている。"db:make"を作成して、新しい移行ファイルを作成します。次に、Schema :: table( 'users'、function($ table){$ table-> integer( 'paid');});を配置します。その中に。そして、「php artisan migrate」を実行しますが、致命的なエラーが発生します:
/Applications/XAMPP/xamppfiles/htdocs/adsense/application/migrations/2013_05_28_122527_users.phpの

マイグレーションを作成するときは、それぞれに固有の名前を付ける必要があります。通常、最初の作成では名前を付けcreate_users_table、次に列を追加する場合はとしますadd_email_password_columns_to_users
tplaner

ええ、evolveが言うように、確かにオリジナルのlaravel設計哲学に固執しadd_、変更を追跡するために各ファイルの前にある " "動詞のみを使用する方が良いでしょう。これにより、バージョン管理などの変更を追跡するのが容易になります。反復ごとに新しい追加ファイルが作成されるためです。「create_」を変更し続けただけでは、xの従業員が、インデックスを削除したり、新しい列を追加したりして、何かをめちゃくちゃにしたことを理解するのは難しいでしょう。:)
ワイヤード00 2015年

7

既存の移行ファイルを変更するだけで済みます。たとえば、テーブルに列を追加し、ターミナルで次のように入力します。

$ php artisan migrate:refresh

11
更新するとテーブルが空になります
JohnTaa

8
これは信じられないほど危険です。古いバージョンを実行している人がいると、新しいバージョンを持っている人がいて、混乱が起こります。Liquibaseでは、ファイルを編集する場合、例外を明示的に指定して許可しない限り、ファイルは失敗します。これを実行できるのはごくわずかな場合に限られます。たとえば、一部のデータベースにすでにnullデータが含まれているときに列をnull以外にすると、破損します。
John Little

3
答えを編集して、テーブルを空にすることを述べれば、さらに良いでしょう。
アベル

注:このコマンドを使用すると、データベーステーブル全体クリーンアップされます。使用する場合は、最初にデータベースをバックアップします
Udhav Sarvaiya

5

これはlaravel 5.1で動作します。

まず、ターミナルでこのコードを実行します

php artisan make:migration add_paid_to_users --table=users

その後、プロジェクトディレクトリに移動し、ディレクトリデータベースを展開します-移行および編集ファイルadd_paid_to_users.php、このコードを追加します

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

その後、ターミナルに戻り、このコマンドを実行します

php artisan migrate

この助けを願っています。


5

最初に以前の移行をロールバックする

php artisan migrate:rollback

その後、既存の移行ファイルを変更し(新規の列の追加、名前の変更、または削除)、移行ファイルを再実行します。

php artisan migrate

0

移行ファイルは他の人が述べたようにベストプラクティスですが、ピンチでティンカーを使用して列を追加することもできます。

$ php artisan tinker

端末のワンライナーの例を以下に示します。

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



(ここでは読みやすいようにフォーマットされています)

Schema::table('users', function(\Illuminate\Database\Schema\Blueprint $table){ 
    $table->integer('paid'); 
});
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.