【Laravel】マイグレーションのカラム(データ型)の種類まとめ!完全版

この記事からわかること

  • Laravelmigrationで指定できるカラム(データ型)の種類
  • 中でもよく使うデータ型
  • 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テーブル↓↓↓↓

マイグレーションで作成したusersテーブル

メソッドの第一引数に文字列を指定することでカラム名を設定できます。

ちなみにデータベース構造の中で表自体をテーブル列をカラム行をレコードと呼びます。カラム分の値を持ったレコードがデータ本体部分となり格納されていきます。

データ型を指定する際のオプション(修飾子)

メソッドを使ってデータ型を指定するときにもさまざまなオプション(修飾子)を付けることができます。

使えるオプション

文字数を制限する

文字型のカラムを指定する際には文字数を制限することができます。

設定方法はメソッドの第二引数に数値を指定することでその数値に制限されたカラムを生成できます。

$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値の使用を不可能にすることができます。

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index