Laravelのmigrationを包括的にまとめています。
マイグレーションの作成から始まって、マイグレーションのコマンド一覧、カラムを追加する方法・カラムの属性を変更などです。
マイグレーションを作る
マイグレーションファイルのみ作成
最初にマイグレーションファイルを作る方法です。
下記でマイグレーションを作成します。
php artisan make:migration create_hoges_table --create=hoges
–create オプションでテーブル名を指定します。
下記のように作成されたファイル名が表示され
Created Migration: 2020_06_24_055626_create_hoges_table
database/migrations/配下にファイルが配置されます。
ファイルの内容はこんな感じになっています。
class CreateHogesTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('hoges', function (Blueprint $table) {
$table->bigIncrements('id');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('hoges');
}
}
upメソッドのSchema::createクロージャの中に、追加するカラムを記載していきます。
downメソッドはmigrate:rollbackされた時の内容を記述します。
モデルとマイグレーションを一緒に作成する
モデルとマイグレーションファイルを一緒に作成する場合は下記になります。
app直下にモデルファイルが作成されます。
php artisan make:model Hoge --migration
マイグレーションファイルの名前は、下記のような感じで複数形になります。
指定されるテーブルも複数形で指定してくれます。
2020_09_01_092933_create_hoges_table.php
マイグレーションコマンド(migration commands)
migrateコマンドの一覧です。
マイグレーションを実行する
下記でマイグレーションを実行します。
php artisan migrate
マイグレーションが完了したものはmigratedになるようです。
Migrating: 2014_10_12_000000_create_users_table
Migrated: 2014_10_12_000000_create_users_table
マイグレーションを戻す
下記でマイグレーションを実行を取り消します。
php artisan migrate:rollback
ロールバックが完了したものはrolled backになるようです。
Rolling back: 2019_05_13_143136_create_messages_table
Rolled back: 2019_05_13_143136_create_messages_table
マイグレーションを全て戻す
下記でマイグレーションを実行を全て取り消します。
テーブルの全削除です。
php artisan migrate:reset
ロールバックされた旨のメッセージが表示されます。
Rolling back: 2019_05_13_143136_create_messages_table
Rolled back: 2019_05_13_143136_create_messages_table
マイグレーションを当て直す
下記でマイグレーションを全て取り消して再実行します。
全削除して、もう一度当ててるようです。
php artisan migrate:refresh
ロールバックされた旨のメッセージが表示された後に
マイグレーション実行時のログがつらつらと表示されます。
Rolling back: 2014_10_12_000000_create_users_table
Rolled back: 2014_10_12_000000_create_users_table
Migrating: 2014_10_12_000000_create_users_table
Migrated: 2014_10_12_000000_create_users_table
マイグレーション状態の確認(status)
下記でマイグレーション状態を確認できます。
php artisan migrate:status
マイグレーションを実行済みのファイルはRanがYesになります。
+------+------------------------------------------------+-------+
| Ran? | Migration | Batch |
+------+------------------------------------------------+-------+
| No | 2014_10_12_000000_create_users_table | |
| No | 2014_10_12_100000_create_password_resets_table | |
| No | 2019_05_13_142849_create_boards_table | |
| No | 2019_05_13_143136_create_messages_table | |
+------+------------------------------------------------+-------+
カラムを追加する場合
マイグレーションファイルを作成
–tableオプションでテーブルを指定すれば、変更用のマイグレーションが作成されます。
php artisan make:migration add_type_to_hoges_table --table=hoges
sqliteで現在のカラムを確認します…
.schema hoges
CREATE TABLE IF NOT EXISTS "hoges" ("id" integer not null primary key autoincrement, "name" varchar not null, "age" integer not null, "created_at" datetime null, "updated_at" date
time null);
これにtypeカラムを追加してみます。
マイグレーションファイル編集
class AddTypeToHogesTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('hoges', function (Blueprint $table) {
$table->integer('type');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('hoges', function (Blueprint $table) {
$table->dropColumn('type');
});
}
}
upメソッドのSchema::tableのクロージャの中には追加するカラムを記載します。
今回はint型のtypeカラムを追加しています。
downメソッドのSchema::tableのクロージャの中にはロールバック時の処理を書きます。
dropColumnでロールバック時は消えるようにしています。
マイグレーション実行
php artisan migrate
sqliteで確認してみると…
カラムが増えてますね! OK.
.schema hoges
CREATE TABLE IF NOT EXISTS "hoges" ("id" integer not null primary key autoincrement, "name" varchar not null, "age" integer not null, "created_at" datetime null, "updated_at" date
time null, "type" integer not null);
カラムの属性変更
composerでライブラリ追加
ライブラリがないと変更できないようなので、追加します。
このライブラリはデフォルトで入って欲しいですね。
composer require doctrine/dbal
sqliteで現在のカラムを確認します…
typeをintからstringに変更します。
.schema hoges
CREATE TABLE IF NOT EXISTS "hoges" ("id" integer not null primary key autoincrement, "name" varchar not null, "age" integer not null, "created_at" datetime null, "updated_at" date
time null, "type" integer not null);
マイグレーション作成
php artisan make:migration change_type_to_hoges_table --table=hoges
マイグレーションファイル修正
class ChangeTypeToHogesTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('hoges', function (Blueprint $table) {
$table->string('type')->change();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('hoges', function (Blueprint $table) {
$table->integer('type')->change();
});
}
}
upメソッドのSchema::tableのクロージャの中に変更するカラムを記載して、changeメソッドを呼ぶようにします。
今回はint型のtypeカラムをstring型に変更しています。
downメソッドのSchema::tableのクロージャの中にはロールバック時の処理を書きます。
integer型に戻すようにしています。
マイグレーション実行
php artisan migrate
sqliteで確認…
typeの属性が変わりましたね。OK!
.schema hoges
CREATE TABLE hoges (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, name VARCHAR(255) NOT NULL COLLATE BINARY, age INTEGER NOT NULL, created_at DATETIME DEFAULT NULL, updated_at DA
TETIME DEFAULT NULL, type VARCHAR(255) NOT NULL);
ひとつ前にロールバックしたい
step
オプションを使うとロールバックの回数が決めれます。
下記で、データベースに適用した最後のマイグレーションをひとつ戻します。
$ php artisan migrate:rollback --step 1
数値のところを変えると、戻すマイグレーションの数も変わります。
3つ戻す場合は--step 3
になります。
インデックスを貼りたい(index, unique, primary)
インデックスやユニークキーを貼りたい場合もマイグレーションから実施することが可能です。
インデックス・ユニークキー・主キーの作成方法を下記にまとめました。
よく使っているカラムタイプ・修飾子
よく使ってるカラムタイプと修飾子をあげてみました。
詳しくは公式を…
タイプ | mysqlの型 |
---|---|
$table->increments | int(10) unsigned |
$table->bigIncrements | bigint(20) unsigned |
$table->integer | int(10) |
$table->bigInteger | bigint(20) unsigned |
$table->text | text |
$table->string | varchar(255) |
$table->dateTime | datetime |
$table->tinyInteger | bigint(20) unsigned |
カラム修飾子
・after() – mqsqlのみ
カラムを追加するときに、使用します。
引数として、追加する前のカラム名を渡します。
・comment() – mqsqlのみ
引数で渡したコメントをカラムに設定できます。
mysqlworkbenchなどで確認できるので、日本語を設定しておくといいです。
・default()
insert時のデフォルト値を引数で渡して設定できます。
・nullable()
カラムをnull許可にします。ついてないカラムは必須になります。
タイムスタンプの追加
$table->timestamps を指定しておくと、created_atとupdated_atのカラムをtimestampで作ってくれます。
insert時にcreated_atに追加時間がupdate時にupdated_atに更新時間が入ります。
論理削除カラムの追加
$table->softDeletes を指定しておくと、deleted_atのカラムをtimestampで作ってくれます。
laravelでデータを取得したり、削除するときにこのカラムを使ってくれます。
Modelクラスにuse SoftDeletesを書いて、論理削除を使えるようにしておく必要があります。
コメント