マイグレーションの方法と注意点【初心者のLaravel入門講座】

Laravelデータベース

初心者のためのLaravel超入門講座、今回は、migration(マイグレーション)について解説します。

migrationはデータベースを作成する部分。

ここからはMySQLのデータと連携させつつ、すすめていきますね。

前回までの内容はこちらをご覧ください。

マイグレーションとは

まずマイグレーションとは何か?

英語でいうとmigrateが「移住する」migrationは「移住」という意味です。

IT用語として使われるときは、データ移行の意味になります。

Laravelでは、Laravel内のデータをMySQLなどのデータベースに反映させることをいいます。

英語の豆知識

migrationは移住ですが、類似語であるimmigrationは「移民」という意味。

最近「イミグレ」とカタカナで書かれたりもしますよね。

実際にマイグレーションを試してみる

それでは実際にマイグレーションを実行してみましょう。

①MySQLにデータベースを作成

最初にMySQL上にデータベースを作っておきましょう。

「まだデータベースがない!」という場合は、下記のインストール解説記事の【データベースの作成】をご覧ください。

次に、Laravelフォルダ内の【.env】ファイルにMySQLの接続情報を登録しておきます。

ローカル環境なら、ユーザー名やパスワードを設定していなければ、データベース名を変更するだけでOK。

データベースは12行目あたりの【DB_DATABASE=】の部分に入力します。

②新たにテーブルを作成する

ここからLaravelを使って操作していきます。

Laravelをインストールしたフォルダに移動し、コマンドラインに次のように入力してEnterキーを押します。

「testsという名前のテーブル用に、マイグレーションファイルを作ってね」という意味です。

実行すると、「マイグレーションファイルを作ったよ」というコマンドが返ってきます。

Laravelをインストールしたフォルダの database/migrations の中に、新しくマイグレーションファイルができています。

なおマイグレーションファイルは、テーブルを作成したり変更したりするたびに、この場所に作成されていきます。

③マイグレーションファイルを編集する

それでは作成したマイグレーションファイルを編集します。

まずはテーブルにいれる列(カラム)を入力していきましょう。

今回は、下記の5個の列があるデータテーブルを作成したいと思います。

【testsテーブルの中身】

カラム名内容データ型larabelのカラムタイプ
id番号bigintid
title投稿のタイトルvarcharstring
body内容texttext
created_at作成日時timestamptimestamp
updated_at更新日時timestamptimestamp

マイグレーションファイルを確認する

まずマイグレーションファイルの中身を確認してみましょう。

マイグレーションファイルを開くと、【up】関数の部分にすでに【id】と【timestamp】についてカラム情報ができています。

ちなみにtimestampは、「データの作成日時」という意味。

マイグレーションファイルには【timestamps】と複数形で入っておりますが、これで【データの作成日時】と【更新日時】というふたつのカラムを作れます。

マイグレーションファイルを編集する

それではこれから、デフォルトでは入っていない【title】と【body】の2つのカラムをマイグレーションファイルに追加します。

18行目あたりに、下記の2行を加えてください。

編集後のマイグレーションファイルはこちら。

これだけでOKです。

データの型とは

ところで上記の操作を行う際、「データ型とか、カラムタイプってなに??」と思いませんでしたか。

Junko
Junko

私は最初、めっちゃ思いました!

同じようにここでつまづく人のために、補足説明をしますね。

【データの型】とは、どんな種類のデータを入れるかという取り決め。カラムごとに、データ型を指定します。

MySQLでよく使うデータ型には、次のようなものがあります。

【MySQLでよく使うデータ型例】

TINYINT 小さい整数。符号なしの範囲は0から255まで。ユーザー名やパスワードなど、255文字以内におさまるデータに使える。
INT 普通のサイズの整数。数字を入れるものに使える。
VARCHAR 可変長文字列。短めのテキストに使える。
TIMESTAMP タイムスタンプ。データベースにデータを更新する際、自動的に現在の日付と時刻を指定できる。
TEXT テキスト情報を入れる。投稿内容などに使える。

データの型は公式マニュアルでチェック

上記のデータ型は、そのままの形ではLaravelに使えません。

Laravelには、各データ型に対応したカラムの書き方があります。

どのように書くか知りたい場合には、Laravelのマニュアルでチェックしましょう。

たとえば、短めの文を入れるときに使えるデータ型【varchar】を使ってカラムを作りたい場合は、上記のページで【varchar】を検索します。

いくつか候補が出てきますが、一番良く使うのは、string() となります。

【公式マニュアル】

マニュアルには上記のように、Laravelのstring型で【name】という名前のカラム(列)を作る時に、マイグレーションファイルにどのように書けば良いかの例が書かれています。

なお、例では「100」という文字が入っています。これは、文字数制限をいれる場合に記述します。

文字数制限を入れなくても大丈夫です。

その場合、文字数は255文字まで入れられます。

今回の【タイトル】部分のカラムは、次のように文字数制限の指定なしで入れておきましょう。

「むずかしい!」と思った人へ:

このあたり、ちょっとややこしい上に、面倒ですよね。

とりあえず

  • 短めの文章を入力するカラムは【 $table->string(‘カラム名’);】
  • 長めの文章を入力するカラムは【 $table->text(‘カラム名’);
  • 整数がはいるカラムは【$table->integer(‘カラム名’);】

という形でマイグレーションファイルに入力しましょう。

また必要になったら、ググってみる感じでOK。

④マイグレートを実施する

マイグレーションファイルを編集した後は、マイグレートを行います。

これは、「マイグレーションファイルで行った変更をMySQLにも反映させてね」ということ。

次のようにコマンドを入力するだけでOK.

実施後は、MySQLをチェックしてみてください。

作成したデータベースの中の【tests】テーブルに、次のようにデータベースができていれば、成功です。

migrate後のmysqlのテーブル

テーブルに変更を加えたいとき

以上がテーブルの作成方法です。

次にテーブルに変更を加えたい場合の方法について説明します。

今回は「user_id」というカラムを追加する方法を解説します。

①カラムを1列追加する

カラムを追加するには、次のコマンドを実行しましょう。

実行すると、「マイグレーションファイルを作ったよ」というコマンドが返ってきます。

Laravelをインストールしたフォルダの database/migrations の中に、「今日の日付_add_user_id_to_tests_table.php」という名前で新しくマイグレーションファイルができています。

②マイグレーションファイルを編集する

それでは作成したマイグレーションファイルを編集します。

テーブルにいれる列(カラム)を入力していきましょう。

up関数に、下記の一行を追加します。

追加後のファイルは、このようになります。

user_idには、idで使われるのと同じ【符号なしBIGINT】というデータ型を用います。

unsignedBigIntegerの代わりに、foreignIdを使ってもOKです。

Junko
Junko

こちらのほうが短めで書きやすいですし、良く使われているかと思います。

また【->after(‘id)】と入力してありますが、こうすれば、新しいカラムはidカラムの後に作成されます。

③削除時の処理について追加する

次に、ファイルの下部の[down]の項目に下記の1文を追加しておきましょう。

追加後のファイルは、このようになります。

これは、「削除時はuser_id列を削除してね」という命令文です。

テーブルを新規作成するときは削除時の処理が最初からはいっていますが、今回のようにカラムを追加する場合には入っていません。

このままでは、もし削除をしたときいに、きれいに削除ができません。

そこでこのように、手動でドロップカラムの命令を入力する必要があるのです。

④マイグレートを行う

それでは、最後にまたマイグレートを実施しましょう。

次のようにコマンドを実行します。

MySQLを開き、testsテーブルの構造を確認してみてください。

下記のように、idの下に【user_id】カラムが追加されていれば成功です。

マイグレーション時の注意点

なおマイグレートを一度かけた後は、マイグレーションファイルを手動で編集するのは、絶対やめましょう。

ララベルが「知らないうちに変わっちゃってる!!」が混乱し、おかしなことになってしまいます(←経験済^^;)。

もし手動で変更してしまったりしてデータがおかしくなった場合には、「取り消し処理」を行います。

この方法を解説しますね。

マイグレートの取り消し

実施したマイグレートを取り消したいという場合は、ロールバック(Rollback)を行います。

次のコマンドを実施してください。

マイグレートを1回分、巻き戻すことができます。

Rillbackを行う前に、MySQLの「migrations」テーブルをチェックしておきましょう。

migrate するごとに、batch番号(上記表の右側)が増えていきますが、Rollbackを1度かけると、一番大きいbatch番号のmigrationファイルがまとめて削除されます。

ロールバックの後は、ファイルを新たに作り直しても良いですし、既存のファイルを書きなおして再度マイグレートを行ってもOKです。

なおロールバックの他にも、いくつか取り消し処理はあります。

こちらの記事も参考にしてください。

まとめ

今回はLaravelのマイグレーションについて解説しました。

今回のまとめ

【新規作成時】

  • 新たにテーブルを作るときは【php artisan make:migration】 でマイグレーションファイルを作る
  • マイグレーションファイルを編集し、カラムを追加する
  • そのあとにマイグレートを行い、MySQLに反映させる

【追加時】

  • カラムを新たに追加するときは 【php artisan make:migration add】で列を追加する
  • マイグレーションファイルを編集し、カラムを追加し、ドロップ関数を追加する
  • そのあとにマイグレートを行い、MySQLに反映させる

【修正】

  • 処理をまちがえたらRollbackを行えば、マイグレート処理を巻き戻すことが可能
じゅんこ
じゅんこ

マイグレーションは実際に色々テーブルを作ってみたりして、実践してみてください。

失敗しても、RollbackすればOK!

それに本番で失敗するより、 勉強中にいっぱい失敗しておいたほうが安全です♪

次回は、モデルの作成に入っていきます。

なお、もし

「実際のプロジェクトでマイグレーションをどう使うか、知りたい。」

「もっと実践的に学びたい!」

と思ったら、学習サイト「Laravelの教科書」も見てみてくださいね。

今回解説したマイグレーションもガンガン行いつつ、Laravelの使い方を学びながら、フォーラムサイトを作成していける内容となっています。

【Laravelの教科書を通じて、作成するサイト例】

詳しい案内は、下記をご覧ください。

現在基礎編を無料プレゼント中です♪

↓↓↓

Laravelの教科書について詳しく知る

Laravelデータベース Laravel入門講座

【Laravelの教科書・プレゼント】

Junko
Laravelの使い方を覚えたい!と思ったら、ぜひ、役立ててほしいです。 基礎編は無料でプレゼント中です♪
ひつじプログラマ
会員制サイトをいちから作っていくよ。ボタンをクリックして詳細を見てね。
Laravelの教科書の詳細を見る

最新のLaravel10版テキストに加え、Laravel8版・Laravel9版もご用意しています♪

【無料プレゼント】

「LaravelでWebアプリをいちから作れるようになりたい!」

そんなLaravel初心者のあなたへ【Laravelの教科書】基礎編プレゼント中! 会員制フォーラムサイトを学習しながら作れます。

詳細はこちらをクリック

最新のLaravel10版テキストに加え、Laravel8版・Laravel9版もご用意しています♪

Laravelの本を書きました。


ひつじが目印♪
クリックするとamazonページへ。

Laravelの使い方を分かりやすく解説した書籍を出版しました。書店やAmazon等のオンラインショップにて販売中です。
Laravel10対応。Laravel11サポートガイドもご用意しています。詳しくは下記ボタンをクリック♪

書籍の詳細を見てみる

Laravelの本を書きました。


ひつじが目印♪
クリックするとamazonページへ。

Laravel10対応

Laravelの使い方を分かりやすく解説した書籍を出版しました。書店やAmazon等のオンラインショップにて販売中です。

書籍の詳細を見てみる


Laravelの教科書限定コミュニティ【Laravelの教科書ラボ】はじめました。
セミナーで、StripeやChatGPT連携、デバックなど実践スキルを分かりやすく学べます。

ラボの案内を見てみる

Twitter始めました。
40代からプログラミング!
タイトルとURLをコピーしました