migrationファイルの作成方法、migrateコマンドの実行方法について解説します。マイグレーション関連の操作は色々とできますが、特に知っておくと良いメソッドや操作について取り上げています。
マイグレーションの生成
新規テーブルを作成したい場合
「tests」というテーブルを作成する場合、--createオプション
を指定します。
php artisan make:migration create_tests_table --create=tests
以下マイグレーションファイルが生成されました。
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateTestsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('tests', function (Blueprint $table) {
$table->increments('id');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('tests');
}
}
既存テーブルの構造を変更したい場合
「tests」というテーブルの構造を変更したい場合、--tableオプション
を指定します。
php artisan make:migration add_column_to_tests_table --table=tests
以下マイグレーションファイルが生成されました。
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class AddColumnToTestsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('tests', function (Blueprint $table) {
//
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('tests', function (Blueprint $table) {
//
});
}
}
テーブル構造の指定
カラムの 型指定
について確認します。
ここでは、下記コマンド実行後に生成されたマイグレーションファイルを編集していきます。
php artisan make:migration create_tests_table --create=tests
マイグレーションファイルには、以下のように記述しました。
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateTestsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('tests', function (Blueprint $table) {
$table->increments('id');
$table->integer('integer')->comment('数値');
$table->bigInteger('big_integer')->default(0);
$table->integer('unsigned_integer_1')->unsigned();
$table->unsignedInteger('unsigned_integer_2');
$table->float('float', 8, 2);
$table->double('double', 15, 8);
$table->string('string')->nullable();
$table->string('string100', 100);
$table->text('text');
$table->enum(
'enum',
['DEBUG', 'INFO', 'NOTICE', 'WARNING', 'ERROR', 'CRITICAL', 'ALERT', 'EMERGENCY']
);
$table->geometry('geometry');
$table->json('json');
$table->date('date');
$table->dateTime('dateTime');
$table->timestamp('timestamp');
$table->timestamps();
$table->softDeletes();
$table->unique('integer');
$table->index(['string', 'string100']);
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('tests');
}
}
マイグレーションの実行
下記コマンドでマイグレーションを実行します。
php artisan migrate
作成されたテーブルを確認
今回のマイグレーションで以下テーブルが作成されました。DBはMySQL5.7です。
mysql> SHOW COLUMNS FROM `tests`;
+--------------------+--------------------------------------------------------------------------------+------+-----+-------------------+-----------------------------+
| Field | Type | Null | Key | Default | Extra |
+--------------------+--------------------------------------------------------------------------------+------+-----+-------------------+-----------------------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| integer | int(11) | NO | UNI | NULL | |
| big_integer | bigint(20) | NO | | 0 | |
| unsigned_integer_1 | int(10) unsigned | NO | | NULL | |
| unsigned_integer_2 | int(10) unsigned | NO | | NULL | |
| float | double(8,2) | NO | | NULL | |
| double | double(15,8) | NO | | NULL | |
| string | varchar(255) | YES | MUL | NULL | |
| string100 | varchar(100) | NO | | NULL | |
| text | text | NO | | NULL | |
| enum | enum('DEBUG','INFO','NOTICE','WARNING','ERROR','CRITICAL','ALERT','EMERGENCY') | NO | | NULL | |
| geometry | geometry | NO | | NULL | |
| json | json | NO | | NULL | |
| date | date | NO | | NULL | |
| dateTime | datetime | NO | | NULL | |
| timestamp | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
| created_at | timestamp | YES | | NULL | |
| updated_at | timestamp | YES | | NULL | |
| deleted_at | timestamp | YES | | NULL | |
+--------------------+--------------------------------------------------------------------------------+------+-----+-------------------+-----------------------------+
19 rows in set (0.00 sec)
テーブル作成で実行されたSQL
テーブル作成時に実行されたSQLは以下のようになります。
mysql> SHOW CREATE TABLE `tests`\G;
*************************** 1. row ***************************
Table: tests
Create Table: CREATE TABLE `tests` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`integer` int(11) NOT NULL COMMENT '数値',
`big_integer` bigint(20) NOT NULL DEFAULT '0',
`unsigned_integer_1` int(10) unsigned NOT NULL,
`unsigned_integer_2` int(10) unsigned NOT NULL,
`float` double(8,2) NOT NULL,
`double` double(15,8) NOT NULL,
`string` varchar(255) DEFAULT NULL,
`string100` varchar(100) NOT NULL,
`text` text NOT NULL,
`enum` enum('DEBUG','INFO','NOTICE','WARNING','ERROR','CRITICAL','ALERT','EMERGENCY') NOT NULL,
`geometry` geometry NOT NULL,
`json` json NOT NULL,
`date` date NOT NULL,
`dateTime` datetime NOT NULL,
`timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
`deleted_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `tests_integer_unique` (`integer`),
KEY `tests_string_string100_index` (`string`,`string100`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC
1 row in set (0.00 sec)
※補足
$table->timestamps();
でcreated_at
とupdated_at
が作成されています。$table->softDeletes();
でdeleted_at
が作成されています。
外部キー制約
外部キー制約も定義できます。
「testsテーブルのuser_id」を外部キーとして、「usersテーブルのid」を参照するようにする場合、以下のように記述します。
Schema::create('users', function (Blueprint $table) {
$table->increments('id');
:
});
Schema::create('tests', function (Blueprint $table) {
$table->increments('id');
$table->unsignedInteger('user_id');
$table->foreign('user_id')
->references('id')
->on('users')
->onDelete('cascade'); // 参照先が削除されたら同時に削除
注意点
- 先に参照先のテーブルを作成します。
- 参照元のカラムと参照先のカラムの型が一致する必要があります。
- incrementsスキーマビルダーは符号なしINT型を生成します。そのため、参照元カラムのスキーマビルダーとしてunsignedIntegerを利用しています。
- 削除時(drop)は、先に参照元テーブルを削除します。
テーブル構造変更
テーブル構造変更する際に活躍するメソッドを紹介します。
存在するときだけ実行
if (Schema::hasTable('tests')) {
// testsテーブルが存在するときだけ実行
}
if (Schema::hasColumn('tests', 'name')) {
// testsテーブルにnameカラムが存在するときだけ実行
}
rename|テーブル名変更
Schema::rename('現在のテーブル名', '変更後のテーブル名');
renameColumn|カラム名変更
renameColumnメソッド
を利用してカラム名を変更します。
Schema::table('tests', function (Blueprint $table) {
$table->renameColumn('from', 'to');
});
change|カラム属性変更
changeメソッド
を利用してカラム属性を変更します。
Schema::table('tests', function (Blueprint $table) {
$table->string('string100', 1000)->change();
});
after|カラム追加位置指定
release_date
というカラムの後に scheduled_date
というカラムを追加したい場合、以下のようにします。
Schema::table('tests', function (Blueprint $table) {
$table->dateTime('scheduled_date')->after('release_date');
});
drop|カラム削除
dropメソッド
を利用してカラムを削除します。
Schema::table('tests', function (Blueprint $table) {
$table->dropColumn('name');
});
ロールバック
ロールバック
最後のマイグレーションをロールバックします。
php artisan migrate:rollback
全てロールバック
全てのマイグレーションをロールバックします。
php artisan migrate:reset
データベース作り直し
refresh
全てのマイグレーションをロールバック後、マイグレーションを実行します。
php artisan migrate:refresh
fresh
全てのテーブルを削除後、マイグレーションを実行します。
php artisan migrate:fresh