【Laravel】マイグレーションのカラム(データ型)の種類まとめ!完全版
この記事からわかること
- Laravelのmigrationで指定できるカラム(データ型)の種類
- 中でもよく使うデータ型
- migrationファイルでの記述方法
- timestampsに値が格納されない時の解決法
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
Laravelに常設されている機能の1つマイグレーション。データベース構造を定義しておくだけで一発でデータベース上にテーブルを作成してくれる便利な機能です。
今回は定義する時に意外と忘れがちなカラムのデータ型やオプションなどをまとめていきたいと思います。
よく使うデータ型6選
まずはこれだけ覚えておけばOKなよく使うデータ型をまとめてみました。
メソッド | DB上のデータ型 | 概要 |
---|---|---|
increments | UNSIGNED INTEGER | 自動増分オートインクリメント |
integer | INT | 4バイトまでの整数 |
string | VARCHAR | 可変長(長さがバラバラ)の文字 |
text | TEXT | 最大長65535までの文字 |
boolean | BOOLEAN | 真偽値 |
timestamps | TIMESTAMP | 作成日と更新日を自動生成 |
Laravelのmigrationファイル(Blueprintクラス)ではデータ型の名前と同じや似たような名前のメソッドが用意されているので引数に指定した$tableからメソッドを呼び出すだけでOKです。
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->rememberToken();
$table->timestamps();
});
}
↓↓↓↓作成されるusersテーブル↓↓↓↓
メソッドの第一引数に文字列を指定することでカラム名を設定できます。
ちなみにデータベース構造の中で表自体をテーブル、列をカラム、行をレコードと呼びます。カラム分の値を持ったレコードがデータ本体部分となり格納されていきます。
データ型を指定する際のオプション(修飾子)
メソッドを使ってデータ型を指定するときにもさまざまなオプション(修飾子)を付けることができます。
使えるオプション
- 文字数を制限する
- デフォルト値を指定する(default)
- コメントを入れる(comment)
- 符号有無を指定する(unsigned)
- selectで取得できないようにする(invisible)
文字数を制限する
文字型のカラムを指定する際には文字数を制限することができます。
設定方法はメソッドの第二引数に数値を指定することでその数値に制限されたカラムを生成できます。
$table->string('board_title',40);
デフォルト値を指定する(default)
データを格納(insert)する際に値を指定しなくてもデフォルトで指定の値を設定できるようにできます。
設定するには修飾子を活用します。データ型を指定するメソッドに対してdefault修飾子
をつけることでデフォルト値を設定できます。
$table->integer('category_id')->default(1);
コメントを入れる(comment)
データベースの値ではなく、コメントも設定できます。(メモ書き用の項目)
comment修飾子
を使って設定可能です。
$table->integer('count')->comment('これはカウントされた値です');
符号有無を指定する(unsigned)
「unsigned」とは日本語に「符号無し」という意味の英単語です。例えばTINY INT型であれば-128 〜 +127までですが符号無しにすると0〜255までの正数のみが使えるようになります。
ID値などは負数を使わないのでunsignedとしておくのが基本になります。
$table->bigInteger('user_id')->unsigned();
selectで取得できないようにする(invisible)
データベースに格納しているデータをSQL文で抽出する際に指定のカラムを抽出できないように設定することもできます。
$table->text('hidden')->invisible();
これで以下のようなSQL文でもデータを取得できなくなります。
SELECT * from テーブル1
主キーの指定
データベース構造に欠かせないのが主キーです。
主キーとはその「テーブルのレコードを一意に識別できるカラム」のこと。つまりIDなどといったデータの識別番号のことを指すことが多いです。
主キーの設定は手動でも自動でも指定することができます。
手動で設定する場合はprimaryメソッド
の引数に主キーにしたいカラム名を渡して指定します。
$table->integer('id');
$table->primary('id');
わざわざ手動で設定しなくてもincrementsメソッド
やautoIncrement修飾子
を使うと自動的に主キーとして設定されます。
$table->increments('id');
$table->integer('id')->autoIncrement();
これでオートインクリメント(自動増分)機能を持った主キーのカラムを生成できます。
複合キーの指定
主キーを複数登録したい(複合キー)場合は先ほどのprimary修飾子
に配列で複数のカラム名を指定すればOKです。
$table->primary(['user_id','address_id']);
複合キーとは複数のカラムの値によってレコードを一意に特定するキーです。イメージは学年,組,番号で1生徒が識別できる感じです。
外部キーの追加
外部キーとは別テーブルのカラムに存在している値しか格納できないように制限できるカラムのことです。テーブル同士を関連づける時に使用します。
外部キーを設定することで関連付けているカラムの値が削除された時に自動で外部キー側のデータも自動で削除してくれる一貫性の高い構造を実現することができます。
マイグレーションを使って外部キーを設定するには注意点があります。
- 関連付ける項目のあるテーブルを先に作成しておく
- 関連付ける項目と全く同じデータ型、オプションのカラムにする
// usersテーブル
$table->increments('id') // ユーザid
// 先にこちらのテーブルをマイグレートされるようにしておく
// boardsテーブル
$table->increments('boards_id') // 記事id
$table->integer('users_id')->unsigned(); // ユーザid 同じデータ型(オプション)にしておく
// 外部キーとして登録
$table->foreign('user_id') // 外部キーとして登録したいカラム
->references('id') // 参照元テーブルカラム
->on('users') // 参照元テーブル
->onDelete('cascade'); // 参照先が削除されたら同時に削除
これでboardsテーブルのusers_idカラム
が外部キーとして登録されました。usersのデータが削除されると該当idがboardsテーブルにある場合自動で削除されます。
incrementsメソッド
で生成されるのは「unsigned integer」なのでデータ型を同じにしておきます。元にするカラムによってデータ型も変わりますので注意してください。
timestampsの使用方法
データ型のメソッドの中でもtimestamp()メソッド
を使うと自動的に作成日(created_at)と更新日(updated_at)というdateTime型の2つのカラムを生成してくれます。
$table->timestamps();
これでデータ(レコード)を作成時に自動で2つの値も生成してくれます。しかし私はこのまま以下のように(timestampsを指定しない)レコードをinsertしてもnull値しか格納されませんでした。
DB::insert('INSERT INTO boards (user_id,board_title,board_text) VALUES (:user_id,:title,:question)', $param);
なのでレコードが登録、更新された時にそれぞれ値が格納されるように修飾子を使って作成しました。
timestampsに値が格納されない時の解決法
$table->timestamp('updated_at')->useCurrent()->useCurrentOnUpdate()->nullable(false);
$table->timestamp('created_at')->useCurrent()->nullable(false);
useCurrent修飾子
useCurrent修飾子
はCURRENT_TIMESTAMP(現在の時刻)をデフォルト値として格納してくれる修飾子です。
useCurrentOnUpdate修飾子
useCurrentOnUpdate修飾子
はレコードが更新されたタイミングでCURRENT_TIMESTAMP(現在の時刻)を格納してくれる修飾子です。
nullable修飾子
nullable修飾子
は値にnull値を許容するかどうかを設定できる修飾子です。引数にfalse
を指定することでnull値の使用を不可能にすることができます。
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。