Posted at

LaravelのMigrationについて調べた結果

More than 3 years have passed since last update.


LaravelのMigrationについて



  • 公式ドキュメント




  • 公式ドキュメント引用


    マイグレーションとはデータベースのバージョンコントロールのようなもので、

    チームでアプリケーションデータベースのスキーマを簡単に更新し共有できるようにしてくれます。

    通常、マイグレーションはアプリケーションのデータベーススキーマを簡単に構築できるようにする、

    Laravelのスキーマビルダーと一緒に使用します。





コマンド一覧

migrate              Run the database migrations

migrate:install Create the migration repository
migrate:refresh Reset and re-run all migrations
migrate:reset Rollback all database migrations
migrate:rollback Rollback the last database migration
migrate:status Show the status of each migration


migrate


  • Migrationを実行します


  • 実行したMigrationはテーブル migrations に登録されます

    +----------------------------------------+-------+
    
    | migration | batch |
    +----------------------------------------+-------+
    | 2016_08_08_155034_create_videos_lookup | 1 |
    | 2016_08_08_155046_create_videos | 1 |
    | 2016_08_17_155046_modified_videos | 1 |
    +----------------------------------------+-------+



  • テーブル migrations に登録されたMigrationは migrate コマンドで実行されません


    • このため新規作成と変更と別々のMigrationを作成する必要があります

    • テーブルのバージョン管理です




migrate:install



  • migrations テーブルを作成します

  • ただそれだけ


migrate:refresh


  • Migrationを再実行してテーブルを再構築します

  • Migrationが存在するテーブルは全て初期化されます


    • データも全て吹っ飛びます(!要注意!)



  • テスト環境でテーブル定義を作りなおした時なんかに使える

  • 本番で使わないこと!


migrate:reset


  • 全てのMigration操作を元に戻す

  • 元に戻すっていうかテーブル全部削除する感じ??


migrate:rollback


  • 一つ前のMigration操作を元に戻す


  • migrations で管理されている batch カラムで制御している


  • migrations テーブルが以下の状態でコマンドを打つと 2016_08_17_155811_ModifyVideos2 の操作がロールバックされる

    +----------------------------------------+-------+
    
    | migration | batch |
    +----------------------------------------+-------+
    | 2016_08_08_155034_create_videos_lookup | 1 |
    | 2016_08_08_155046_create_videos | 1 |
    | 2016_08_17_155520_ModifyVideos | 1 |
    | 2016_08_17_155811_ModifyVideos2 | 2 |
    +----------------------------------------+-------+



  • コマンド実行後の migrations

    +----------------------------------------+-------+
    
    | migration | batch |
    +----------------------------------------+-------+
    | 2016_08_08_155034_create_videos_lookup | 1 |
    | 2016_08_08_155046_create_videos | 1 |
    | 2016_08_17_155520_ModifyVideos | 1 |
    +----------------------------------------+-------+



migrate:status



  • Migrationファイルと実行状況を見ることができる

    +------+----------------------------------------+
    
    | Ran? | Migration |
    +------+----------------------------------------+
    | Y | 2016_08_08_155034_create_videos_lookup |
    | Y | 2016_08_08_155046_create_videos |
    | Y | 2016_08_17_155520_ModifyVideos |
    | N | 2016_08_17_155811_ModifyVideos2 |
    +------+----------------------------------------+



Migrationで運用する方法を考える


テーブル新規作成


  • LaravelのMigrationを使用する


Migrationファイルを作成


  • Laravelプロジェクトのルートへ移動


  • Migrationファイル作成コマンドを打つ

    php artisan make:migration [migration ファイル名]

    ex) php artisan make:migration CreateVideos




  • Migrationファイルは以下ディレクトリに作成される

    database/migrations/[作成日時]_modified_videos.php
    
    ex) `database/migrations/2016_08_08_155046_create_videos.php



Migrationにテーブル定義を記述


  • 作成したMigrationファイルにテーブル定義を記述していく


  • 記述方法の詳しいドキュメントは以下




  • 作成例

    public function run()
    
    {
    // videos テーブルを作成する処理
    Schema::create('videos', function (Blueprint $table){
    $table->engine = 'InnoDB';

    $table->increments('id');
    $table->string('title');
    $table->string('description');
    $table->timestamps();
    $table->softDeletes();
    });
    }

    public function down(){}




Migrationコマンドを実行



  • 作成したMigrationを実行してテーブルを新規作成する

    php artisan migrate
    


  • これでテーブルが新規作成される


  • 一度実行したMigrationはテーブルmigrationsに記録され上記コマンドで再実行されることはない



テーブル定義変更


  • LaravelのMigrationを使用して定義を変更する

  • 一度実行したMigrationファイルはphp artisan migrateで再実行されることがないので、定義変更用のMigrationファイルを作る必要がある


Migrationファイルを作成



  • 基本的に新規作成時と同じ

    php artisan make:migration [migration ファイル名]

    ex) php artisan make:migration ModifyVideos




Migrationに変更したい定義を記述


  • 作成したMigrationファイルにテーブル定義を記述していく


  • 記述方法の詳しいドキュメントは以下




  • 作成例

    public function run()
    
    {
    // videos テーブル定義を変更する
    Schema::table('videos', function (Blueprint $table){

    // 新規カラムを追加する
    $table->string('new_column');

    // カラムの定義を変更する
    $table->string('original_file_name')->nullable()->change();
    });
    }

    public function down(){}




Migrationコマンドを実行



  • 作成したMigrationを実行してテーブル定義を変更する

    php artisan migrate
    


  • これでテーブル定義が変更される