データベースのカラムの設定(マイグレーションファイル) まとめ

2022/05/25

Laravel ではマイグレーションという便利な機能(データベースを管理する機能)が用意されています。

カラムの追加や削除はマイグレーションファイルで行います。

しかし、毎回、書き方を忘れてしまうんですよね。

そんなわけで、今回はマイグレーションファイルにおけるカラムの設定についてまとめました。

 
INDEX

 

書式

基本

例:nameカラムのデータ型を 「varchar」 に設定


$table->string('name');

 

カラム属性の変更

chengeメソッドは存在するカラムを新しいタイプへ変更するか、カラムの属性を変更します。

例:nameのカラムのサイズを25から50へ変更


$table->string('name', 50)->change();

 
例:さらにNULL値を設定可能にする


$table->string('name', 50)->nullable()->change();

ポイント

down() では NULL を許容しない制約を記述することになります。
しかし NULL を禁止するメソッドは用意されていないため、SQL を直接書くことになります。


public function down()
{
  Schema::table('users',function(Blueprint $table){
    # ---------------
    # 5.5 以前
    # ---------------
    DB::statement('ALTER TABLE users MODIFY name VARCHAR NOT NULL;');

    // SQL のバージョンによっては以下のような書き方になることも    
    DB::statement("ALTER TABLE `users` CHANGE `name` `name` VARCHAR(255) NOT NULL");

    # ---------------- 
    # 5.5 以降は以下の記述ができます。
    # ----------------
    // $table->string('name')->nullable(false)->change();
    });
  }
}

 

カラムの削除

ロールバックの項目( down() )でよく使います。


$table->dropColumn('name');

ポイント

dropColumnメソッドにカラム名の配列を渡せば、複数のカラムをドロップできます。


$table->dropColumn(['zip', 'country' , 'address']);

 

カラムの設定

データ型
メソッド 説明
increments('id') 「符号なしINT」を使用した自動増分ID(主キー)
unsignedBigInteger('user_id') / foreignId('user_id') 外部キーのカラムを指定する場合は以下のように指定する。


// 外部キーのカラム
$table->unsignedBigInteger('user_id');

// 以下でもOK(laravel 7 以降)
// foreignId メソッドは unsignedBigInteger メソッドのエイリアスです。
$table->foreignId(‘user_id’);

boolean('カラム名') 真偽値カラム ※フラグ関係のカラムはこれを使う


$table->boolean('access_flg')->default(false);

integer('カラム名') INT型(範囲:-2147483647〜2147483647 4バイト)


$table->integer('product_code');
tinyInteger('カラム名') TINYINT型(範囲:0~255 1バイト)
bigInteger('カラム名') BIGINT型
string('カラム名') VARCHAR型 ※デフォルト255文字


$table->string('title')->comment('タイトル');

string('カラム名', 長さ) 長さ指定の VARCHAR カラム


$table->string('name',100);
timestamps() created_at と update_at カラム


$table->timestamps();

text('カラム名') TEXT型


$table->text('memo')->comment('備考欄');

softDeletes() ソフトデリートのためのNULL値可能な deleted_at カラム追加


$table->softDeletes();
ポイント
int型の入力可能桁数
バイト 最小値 最大値
TINYINT 1 -128 127
SMALLINT 2 -32768 32767
MEDIUMINT 3 -8388608 8388607
INT 4 -2147483648 2147483647
BIGINT 8 -9223372036854775808 9223372036854775807

int(11)の 11 は、カラムの表示幅であり、データベースの運用上はあまり意味がありません。intのバイト数は、11 を 10 や 8 に変更しても4バイトであり、結局、2147483647まで格納が可能。
 

テキストデータ
type 最大サイズ
varchar VARCHAR の有効な最大長は、最大行サイズは65,535バイトです。UTF8を使用している場合は、1文字が最大3バイトになり、VARCHARに登録できる文字数は最大21,844文字となります。
text 最大長が 65,535文字のテキストカラム。
MEDIUMTEXT 文字型ラージオブジェクトカラム、最大長は 16,777,215 文字。
LONGTEXT 文字型ラージオブジェクトカラム、最大長は 4,294,967,295 文字。

※ MySQL 4.1より前は、varchar(n)はバイト数でしたが、MySQL 4.1以降は、ユニコード等の実装に伴いマルチバイトも1文字とカウントする文字数になっています。つまり、varchar(255) は255文字。

 

オプション(カラム修飾子)
オプション 説明
comment('コメント内容') カラムにコメントを追加

   
    $table->string('name')->comment('なまえ');
   
   
nullable() カラムにNULL値を許す

   
    $table->text('memo')->nullable()->change();
   
   
unsigned() 符号なし(unsigned)属性を付与する。

   
   // 外部キー設定のときによく使います。
   $table->integer('user_id')->unsigned();
   
   
default('値') カラムのデフォルト値を設定

   
   // デフォルト値null設定
   $table->string('tag')->nullable()->default('NULL');

   $table->integer('sort_order')->unsigned()->default(0)->comment('並び順');
   
   
after('カラム名') 指定したカラムの次にカラムを追加します。
(※ MySQLのみの仕様です。)

   
   # id カラムのあとに user_id カラムを追加
   # 逆の ->before() はないので注意!
   $table->integer('user_id')->after('id');
   
   

 

インデックス
インデックス 説明
index('カラム名') カラムにインデックスを追加

   
    $table->integer('category_id')->index('category_id');
   
   
unique('email') カラムにユニークキーを追加

   
    $table->string('email')->unique('email');
   
   
unsigned() 符号なし(unsigned)属性を付与する。

   
   // 外部キー設定のときによく使います。
   $table->integer('user_id')->unsigned();
   
   

 

外部キーの作成

例:rolesテーブルの user_id を外部キーとしてusersテーブルと紐づける。

外部キーを設定しておくと、rolesテーブルの user_id にusersテーブルの id が自動で入ってくれます。


public function up()
{
    Schema::table('roles', function (Blueprint $table){
        $table->integer('user_id')->unsigned()->change(); // 符号無し属性に変更
        $table->foreign('user_id')->references('id')->on('users'); // 外部キー参照
    });
}

ポイント

increments()で作ったusersテーブルのidカラムにはunsined(符号無し)属性が付与されます。
役割テーブル(roles)のuser_idにも同様の制約をつけないと形式の一致でエラーになります。

 

実例


public function up()
{
	Schema::create('users', function(Blueprint $table)
	{
		$table->increments('id', true)->unsigned()->comment('ID');
		$table->string('family_name', 40)->comment('姓');
		$table->string('first_name', 40)->comment('名');
		$table->string('email')->unique('email')->comment('メールアドレス');
		$table->string('password')->comment('パスワード');
		$table->date('birthdate')->comment('生年月日');
		$table->tinyInteger('gender')->unsigned()->comment('性別 : 1 : 男性 2 : 女性');
		$table->string('zip', 10)->comment('郵便番号');
		$table->tinyInteger('prefecture_code')->unsigned()->comment('都道府県コード : JIS都道府県コード');
		$table->string('prefecture', 40)->comment('都道府県名 フリーテキスト検索で使用');
		$table->string('address')->comment('住所2');
		$table->string('tel', 20)->nullable()->comment('電話番号');
		$table->text('memo', 65535)->nullable()->comment('メッセージ');
		$table->rememberToken();
		$table->timestamps();
		$table->softDeletes()->comment('削除日時 : 削除・退会を行った日時  この値がnullでなかったら、削除・退会を行ったとみなす');
	});
}

 
また、何か発見したら追記していこうと思います。

以上です。

本庄マサノリ

仕事で Laravel を使っています。気づいたことや新しい発見など情報を発信していきます。問い合わせはこちら

>> Twitter をフォローする

 

-周辺知識