Laravel マイグレーション(migration)について
マイグレーションとは
主にMySQLなどのリレーショナルデータベースを操作します。マイグレーションは、データベースのスキーマ(テーブルやカラムの定義など)を定義および変更するためのLaravelの機能です。
マイグレーションを使用してデータベースの変更を行うことにより、データベースの構造変更やデータの追加、変更、削除などの情報がファイルに記録されます。そのため、変更の履歴や内容を共有することができるのでm変更の履歴が明確になります!
マイグレーションの生成
php artisan make:migration create_<テーブル名>_table
database/migrations
に新しい2021_03_25_123456_create_<テーブル名>_table.php
のファイルが生成されていることを確認してください。
2021_03_25_123456
といったタイムスタンプは、artisan make:migration
コマンドを使用してマイグレーションファイルを生成する際に自動的に付与されます。
オプション
--table オプション
特定の既存テーブルに対して変更を加えるマイグレーションを作成するために使用します。
このオプションを使用すると、マイグレーションファイルには指定したテーブルに対する変更を行うためのテンプレートが自動的に生成されます
php artisan make:migration create_<テーブル名>_table --table=<テーブル名>
--create オプション
新しいテーブルをデータベースに追加するためのマイグレーションファイルを作成します。
このオプションを使用すると、新しいテーブルを作成するための基本的なマイグレーションファイルが生成され、テーブルを定義するためのスケルトンコードが含まれます。
php artisan make:migration create_<テーブル名>_table --create=<テーブル名>
マイグレーションファイルの命名規則
新しいテーブルを作成する場合
create_<テーブル名>_table
既存のテーブルにカラムを追加する場合
add_カラム名_to_<テーブル名>_table
複数のカラムを追加する場合
add_columns_to_<テーブル名>_table
既存のテーブルからカラムを削除する場合
remove_カラム名_from_<テーブル名>_table
複数のカラムを削除する場合
remove_columns_to_<テーブル名>_table
テーブル構造を変更する場合
update_<テーブル名>_table
モデル作成時にマイグレーションファイルを同時作成する
最後に-m
を付けることで、モデルファイル作成時にmigration
ファイルとcontroller
ファイルが同時に作成されます!
php artisan make:model <モデル名> -m
マイグレーションファイル
upメソッド
migration
を実行したDBのスキーマを変更するための手順を記述します。
downメソッド
up
メソッドで行ったスキーマの変更を逆に実行するコードを記述します。
例えば、データベースのスキーマを変更するマイグレーションを実行した後に問題が発生した場合、down
メソッドを使用して変更を元に戻したり、取り消し操作を行うことができます。
ちなみにここでのスキーマとは、DBの構造や設計、テーブル、カラム、関数、制約などの定義を指します。
例えば$table->string('name');
はデータベースのテーブルに新しい文字列型のカラムを追加するためのメソッドです。この例では、カラム名を'name'
としています。
主なメソッド
メソッド | データ型 | 説明 |
---|---|---|
string | VARCHAR | 可変長の文字列 |
text | TEXT | 大きなテキストデータを格納する |
increments | 符号なしINT | 1から始まり、次のレコードは2、3と自動的に増加する整数。自動的に主キーとして設定されます |
integer | int | 整数 |
boolean | 真偽値 | 真偽値(trueまたはfalse) |
char | 文字列 | 指定した長さの文字列を格納するカラム |
date | date | 日付 |
dateTime | dateTime | 日付と時間が「YYYY-MM-DD HH:MM:SS」の形式で年、月、日、時、分、秒の情報が含まれています。 |
timestamp | timestamp | 現在の日時 |
timestamps | timestamps | 作成日(created_at)と更新日(updated_at)を作成する |
他にも string('board_title', 40)
とすると、文字数を最大40文字までに制限することができます。
データ型のVARCHARとTEXTの違い
VARCHARとTEXTの選択は、格納するデータの予測されるサイズによって異なります。
VARCHARの使用例
ユーザー名のカラムを作成する際には、VARCHARが適しています。
一般的なユーザー名の長さは比較的短いので例えば、VARCHAR(50)のカラムを作成すると、最大で50文字までのユーザー名を格納でき、ユーザーが50文字よりも短い名前にした場合には使用されるメモリは名前の長さに応じて調整されます。すなわち、ストレージスペースを節約したい場合に適しています。
TEXTの使用例
ブログの本文や記事のコンテンツなど、大きなテキストデータを格納する場合には、TEXTが適しています。
メモリ使用量は固定であり、テキストの長さに関係なく一定です。
データベースカラムに制約を追加するためのメソッド
メソッド | 使用例 | 説明 |
---|---|---|
first | string('name')->first() |
指定したカラムのテーブルの最初のカラムに設定する |
after | string('name')->after('email') |
指定したカラムの次にカラムを追加する |
unique | string('email')->unique() |
同じ値がデータベーステーブルの指定したカラムに重複して保存されることを防ぐ |
change | string('email')->nullable()->change() |
カラムの属性を変更する |
comment | text('content')->comment('blog') |
カラムにコメント追加する |
default | string('status')->default('active') |
カラムのデフォルト値を設定する |
nullable | string('email')->nullable() |
NULL値をデフォルトでカラムに挿入する |
nullable | string('email')->nullable(false) |
NULL値を許容しない |
マイグレーションの実行
マイグレーションを実行してテーブルの作成/変更を行ってください。
php artisan migrate
マイグレーションファイルの内容がデータベースに反映されます。設定した通りにテーブルが作成されているか確認してください。
カラムの構造を確認する方法
MySQLに入り、以下のコマンドでテーブルに含まれるカラムの情報を取得する確認することができます。
SHOW COLUMNS FROM <テーブル名>;
またはデータベース管理ツールのphpMyAdminにログイン後、テーブルを選択し、「構造」タブを選択するとテーブルの構造を見ることができます。
phpMyAdminについては以下の記事でインストール方法を説明しています!
非常に便利なのでインストールしていない方は是非この機会にインストールして使ってみるのがおすすめです!
テーブルにカラムを追加する
migrationファイルを作る
php artisan make:migration add_column_<追加したいカラム名>_to_<テーブル名>_table --table=<テーブル名>
#sail環境
sail artisan make:migration add_column_<追加したいカラム名>_to_<テーブル名>_table --table=<テーブル名>
database/migrationsに作成されたmigrationファイルに以下を追記します。
users
はテーブル名、name
は追加したいカラム名です。
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
```php
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::table('users', function (Blueprint $table) {
$table->string('name'); #追記
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('users', function (Blueprint $table) {
$table->dropColumn('name'); #追記
});
}
};
afterメソッドを使用することで、指定したカラムの後に新しくカラムを追加することができます。
migrationの実行
php artisan migrate
#sail環境
sail artisan migrate
テーブルにカラムが追加されているか確認する。
テーブルのカラムの属性を変更する
migrationファイルの作成
php artisan make:migration change_column_type_<属性を変更したいカラム名>_to_<テーブル名>_table --table=<テーブル名>
#sail環境
sail artisan make:migration change_column_type_<属性を変更したいカラム名>_to_<テーブル名>_table --table=<テーブル名>
database/migrationsに作成されたmigrationファイルに以下を追記します。
今回の例では、必須項目だったname
というカラムでnullを許容するように変更します。
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
```php
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::table('users', function (Blueprint $table) {
$table->integer('name')->nullable()->change(); #追記
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('users', function (Blueprint $table) {
$table->integer('name')->change(); #追記
});
}
};
migrationの実行
php artisan migrate
#sail環境
sail artisan migrate
カラムの属性を変更されているか確認する。
テーブルのカラムを削除する
migrationファイルを作る
php artisan make:migration drop_column_<削除したいカラム名>_column --table=<テーブル名>
#sail環境
sail artisan make:migration drop_column_<削除したいカラム名>_column --table=<テーブル名>
database/migrationsに作成されたmigrationファイルに以下を追記します。
users
はテーブル名、name
は削除したいカラム名です。
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::table('users', function (Blueprint $table) {
$table->dropColumn('name'); #追記
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('users', function (Blueprint $table) {
$table->string('name'); #追記
});
}
};
migrationの実行
php artisan migrate
#sail環境
sail artisan migrate
テーブルのカラムが削除されているか確認する。
ソフトデリート(論理削除)
ソフトデリートとは、データを削除する際に実際にデータを削除するのではなく、削除についてのカラムを作成し、そのカラムに有効か有効ではないかを判断する値を入れることで削除扱いにできるようにする機能のことです。
マイグレーションファイルに$table->softDeletes();
を以下のように追記します。
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::table('employees', function (Blueprint $table) {
$table->softDeletes(); #追記
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('employees', function (Blueprint $table) {
$table->dropSoftDeletes(); #追記
});
}
};
自動的にデータベーステーブルにdeleted_atカラムが追加されるので確認してください。
次にモデルに以下を追記してください。
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes; #追記する
class User extends Model
{
use SoftDeletes; #追記
}
これでこのモデルを使用してレコードを削除すると、deleted_atカラムに削除時のタイムスタンプが設定されるようになります。
削除されたデータは含めずに取得する場合にはwhereNullメソッド
を使用します。
// deleted_atカラムがNULLのレコードのみが取得され、削除されたデータは含まれない
User::whereNull('deleted_at')->get();
Nothing to migrate
マイグレーションが既に実行されている場合に再度マイギュレーションを実行すると表示されると思います。
これは同じマイグレーションを以前に実行していた場合、データベース内migrations
テーブルにその記録が残っているためです。
マイグレーションファイルの状態をリセットする
すべてのマイグレーションがロールバックされます。
sail artisan migrate:reset
特定のマイグレーションだけをロールバックしたい場合
sail artisan migrate:rollback
マイグレーションの状態を確認
sail artisan migrate:status
下記が表示されます。
Migration name ..... Batch / Status
0001_01_01_000000_create_users_table [1] Ran
0001_01_01_000001_create_cache_table [1] Ran
0001_01_01_000002_create_jobs_table [1] Ran
2024_05_29_181223_add_columns_to_users_table [2] Ran
Migration name
マイグレーションのファイル名です。
Batch
この数値は、そのマイグレーションが適用されたバッチ番号を示します。Laravelでは、一度に複数のマイグレーションをグループ化して実行でき、それぞれのグループがバッチとして扱われます。
バッチ番号は実行の順序を示し、ロールバックを行う際にどのマイグレーションが一緒にロールバックされるかを決定するのに使用されます。
Statu
マイグレーションがデータベースに適用されたかどうかを示します。
Ran
はそのマイグレーションが既に実行されており、データベースに変更が適用されていることを意味します。
終わりに
何かありましたらお気軽にコメント等いただけると助かります。
ここまでお読みいただきありがとうございます🎉
Discussion