[st-kaiwa3 r]Laravelを勉強してたらMigrationという言葉が出てきたんだけど、イマイチ分からなくて・・[/st-kaiwa3]
Migration(マイグレーション)とは、一言でいうと、
Laravel用のデータベース項目を作る事を意味します。
[st-kaiwa3 r]よく分からん・・[/st-kaiwa3]
というわけで、図解で初心者にも分かるように解説していきます。
これを読めば、データベースやMigrationがしっかり使いこなせるようになりますよ!
LaravelのMigrationとは?
[st-kaiwa1 r]
migrationを具体的に言うと、database\migrationsフォルダにtable.phpっていうファイルを作って、そこにデータベースに新たに作りたいテーブルとカラムの設定を書いて、データベースに送る一連の作業の事を指してるんだ。
ちなみに、そもそもデータベースが何か理解してる?
[/st-kaiwa1]
[st-kaiwa3 r]いや、それがよく分かってないんだ。[/st-kaiwa3]
[st-kaiwa1 r]じゃあ、そこから説明してくね。[/st-kaiwa1]
LaravelのMigrationに必要なデータベースとは?
データベースとは、投稿されたデータをしまう場所です。
この絵のように、投稿があったらデータベースにしまっておき、ページを表示する時にデータベースから投稿を取り出すんです。
Laravelのblade.phpとは?普通の.phpと何が違う?初心者必須の知識!
LaravelのController.phpとは?初心者向けにやさしく図入りで解説
[st-kaiwa1 r]例えば、君がWordPressとかでブログを書いてるとするよ。じゃあその記事ってどこに保存されてると思う?[/st-kaiwa1]
[st-kaiwa3 r]え・・なんていうか・・PHP上?HTML上?[/st-kaiwa3]
[st-kaiwa1 r]そうじゃないんだ。PHPやHTMLのコード上に直接記事を書いてるわけじゃなくて、記事は記事でデータベースっていう所に保存してるんだ。[/st-kaiwa1]
レンタルサーバーには、MySQLというデータベースシステムが通常入ってます。そしてphpMyAdminというソフトからこのデータベースを見たり編集したりできます。
↑上の画像はLaravelで作った辞書サイトのデータベースです。
↓下の画像は、そのサイトの投稿です。見比べてみてください。
実際に上の投稿が項目別(カラム別)に分けられて、データベースに保存されてるのが分かるでしょうか。
[st-kaiwa3 r]仮にLaravelでブログを作るとしたら、「記事タイトル」「記事本文」「投稿日」「投稿者」のような項目が必要になるって事だね。[/st-kaiwa3]
[st-kaiwa1 r]そういう事!その項目(カラム)とテーブルを作る作業がMigration(マイグレーション)なんだ。[/st-kaiwa1]
[st-kaiwa3 r]なんかそのカラムだとかテーブルだとかって専門用語が分からないんだけど・・[/st-kaiwa3]
Migrationで出てくるデータベース、テーブル、カラムという3つの概念について
下の図を見てください。
まず、MySQLというシステムの中に、データベースを作ります。データベースはサイト単位で通常作ります。
そしてその中に、posts と usersというテーブルを作ったとします。
postsテーブルには、投稿に関するカラムが入ってます。「投稿タイトル」「投稿本文」「書いた人のID」「投稿日付」といった具合です。
usersテーブルには、このサイトにユーザー登録した人の情報をしまう事にします。「ユーザー名」「ログインパスワード」「メールアドレス」といった具合です。このそれぞれの項目がカラム(column)と呼ばれます。
[st-kaiwa1 r]こんな感じで、君のサイトに必要なテーブルをまず作り、その中にカラム(項目)を作っていくんだ。[/st-kaiwa1]
[st-kaiwa3 r]Excelで例えると、book1ファイルがデータベースで、sheet1,2,3がテーブル、そしてABCがカラムって事でOK?
[/st-kaiwa3]
[st-kaiwa1 r]すごくいい例えだね。全くその通りだよ。
データベースで1つ重要な事は、table名は必ず複数形にする必要がある postじゃなくてposts、user じゃなくて users ってね。[/st-kaiwa1]
[st-kaiwa3 r]カラム名は複数形じゃなくていいの?[/st-kaiwa3]
[st-kaiwa1 r]カラムはtitle, created_at のように英字で自由に作ってOK。書き間違い防止に全部小文字を推奨するよ。[/st-kaiwa1]
このテーブルやカラムをなぜ作るのか?サイトにはほぼ必ずフォームを作りますよね?
↑こういうフォームからの投稿を保存するためのExcelみたいなものを作るのがマイグレーションって事なんです。
[st-kaiwa1 r]マイグレーションがなんなのかは大体分かったかな?じゃあここからは実際にLaravelでMigrationのやり方、手順を解説していくよ![/st-kaiwa1]
Migrationをする前に必要な事
そもそも、このMigrationという作業をLaravelでするには、下準備が必要です。
- phpMyAdminからデータベースを作成する
- .envファイルを設定してLaravelがデータベースにアクセスできるようにする
という2つの作業が事前に必要です。
Migration準備1:phpMyAdminからデータベースを作成する
基本的に、1サイトにつき、1データベースが必要ですから、データベースをまずは作ります。
これに関しては、先程出てきたphpMyadminから作ります。
XAMPPでデータベース作成の場合
もし、あなたがXAMPPを使っているなら、MySQLのAdminをクリックすると、phpMyadminがブラウザで立ち上がります。
→Laravel6入門:開発環境の構築とは?XAMPPを例にやさしく解説!
phpMyAdmin にログインしたら、
左メニューから新規作成を選び、データベース名の所にサイト名(Laravelプロジェクト名)を入力します。文字コードがよく分からない場合は、utf8mb4_general_ci をひとまず選んでおけばOKです。
作成ボタンを押せば、データベースの作成は完了です。
サーバーの場合
レンタルサーバーで使う場合は、レンタルサーバー側でまず、Laravelサイト用のデータベースを作成する必要があります。
Xサーバーを例に説明すると、MySQL設定→MySQL追加に進みます。
MySQLデータベース名にLaravel用と分かるような名称を入力して進めば、Laravel用(今回のサイト用)のデータベースの作成が完了です。
ただ、これだけだと、MySQLにログインできません。なので、MySQLユーザー追加タブからユーザーID、パスワードを任意に作ります。(どちらもメモっておいてください。)
MySQL一覧に戻ったら、今作ったデータベースのアクセス権未所有ユーザ項目で、
今作ったユーザーを選んで追加を押します。
これで、今作ったユーザーでこのデータベースにログインできるようになります。
今作ったユーザー名とパスワードでphpMyAdminにログインすれば、
もうデータベースはすでに出来ているはずです。
Migration準備2:.envファイルを設定してLaravelがデータベースにアクセスできるようにする
さて、ひとまず空のデータベースが出来たのですが、今のままだとLaravelからデータベースにアクセスできませんので、設定します。
サイトのフォルダ(Laravelプロジェクトフォルダ)に行き、.envファイルを開きます。
大体9行目くらいにある、DB_という項目を以下のように設定します。
DB_CONNECTION: mysql を設定(データベースがSQLiteなど別のシステムならその名を入力)
DB_HOST: PC上(ローカル)で作ってる場合は通常127.0.0.1です(ローカルのURLと同じ)。レンタルサーバーの場合は、それぞれサーバーのDBホストがあるので、レンタルサーバーの公式サイトなどで調べてください。例えばXサーバーならmysqlxxxxx.xserver.jpのようなアドレスになります。
DB_PORT:3306を通常設定します(レンタルサーバーでも通常同じ)。
[st-kaiwa1 r]
XAMPPのMySQLのPort(s)の所の番号だよ。[/st-kaiwa1]
DB_DATABESE:先程phpMyAdminで作ったデータベース名を入れます。
DB_USERNAME:独自に設定してない限りはデフォルトではrootです。レンタルサーバーの場合は先程作ったphpMyAdminのログインID(ユーザーID)です。
DB_PASSWORD:これもphpMyAdminのパスワードですが、設定してない場合は空でOKです。レンタルサーバーの場合は、先程作ったphpMyAdminのログインパスワードを記入します。
→Larave6入門:MySQL/MariaDBのパスワード設定の簡単なやり方
これで保存する(レンタルサーバーならFTPでアップロードして上書き保存)する事で、Migrationの下準備は完了です。
Migrationの実際のやり方。どんな作業をするのかの流れ
では、実際LaravelのMigraitonはどんな作業をするのかを説明します。
[st-kaiwa1 r]最初に説明した通り、Migrationっていうのは、Laravelサイトに投稿があった場合、その投稿を保存できるように、テーブルとカラムっていう項目を作る作業の事なんだ。ここ理解できてるかな?[/st-kaiwa1]
[st-kaiwa3 r]つまり、データベース上に、「記事タイトル」「記事本文」「コメント」「投稿日時」みたいな項目(カラム)を作っていく作業って事だったよね。[/st-kaiwa3]
[st-kaiwa1 r]そう、それを今からLaravelを通してやっていくよ[/st-kaiwa1]
Migraitonは
- Migraiton用ファイルをコマンドで作成する
- Migration用ファイルにカラムを記入して保存する
- Migrationを実行してデータベースにテーブルとカラムを追加する
という3ステップになってます。
Migration用ファイルをコマンドで作成する
まず、ターミナル(コマンドプロンプト/shell)を開きます。
cdコマンドを使って、Laravelプロジェクトフォルダに移動します。
画像のようにプロジェクトフォルダまでのパスをコピーして、
cd D:\XAMPP\htdocs\liketest のように入力してEnterします。
[st-kaiwa1 r]Dドライブ使っててDドラに移動できない場合は、D:でEnterで移動できるよ。フォルダを戻りたい時は cd .. でできるよ。[/st-kaiwa1]
次に、php artisan make:migration create_posts_table のように入力してEnterします。
すると、database→migrationsフォルダに、create_posts_table.phpというのが追加されました。
これでpostsテーブルを仮作成した状態になります。
このファイルに、カラム(項目)を追加していきます。
Migrationファイルにカラムを記入して保存する
では、実際に今作ったcreate_posts_table.phpをテキストエディタで開いてみます。
↓下の画像のようなコードが出てきます。その中のpublic function up(){ }というカッコの中(赤枠)に、これから作りたいカラムを記入していきます。
例えば、最初から書かれている
$table->bigIncrements(‘id’); は、idカラムです。これは必須なのでこのままでOKです。
$table->timestamps(); は、投稿日と編集日カラムの2つを作ってくれます。これも必須です。
そして、この下に必要なカラムを書いていきます。
この例で言えば、title(タイトル), post(本文), likes(いいねカウント)という3つのカラムを作る前提で書いてます。
string と longtext というのは、文字を意味します。stringを使うと文字数制限があり、指定しなければ255文字までになります。長い文章を扱う本文部分でstringだと足りないので、text, mediumtext, longtextのどれかを使います。超長文でも入るようにlongtextを選んでおけば、後々エラーが出ないでしょうし、入力文字数制限が欲しい場合はLaravel側で作れます。
さらにnullable()というのは、null(空っぽ)が可能という意味です。例えば、入力必須項目にしたいなら、nullableを付けない、必須でないならnullableを付けるという具合です。
[st-kaiwa1 r]上の例で言えば、例えばタイトルが空欄で、本文だけ書いてあった場合は、エラーが出て保存されないけど、逆にタイトルだけで本文が書いてない場合は保存されるって事なんだ。[/st-kaiwa1]
integer というのは数字を意味します。いいねのクリック回数を保存したいので、integerと記入し、default(0)というのは、初期の数値は0にしとくという意味です。
[st-kaiwa1 r]例えば、何かポイントを読者にあげる機能があって、最初から読者が500ポイントを持ってる設定にしたいなら、default(500)とするというわけ。[/st-kaiwa1]
そして、このファイルを上書き保存してください。
Migrationを実行してデータベースにテーブルとカラムを追加する
さて、ファイルにテーブルとカラムの設定は書き込みました。
これをマイグレーションします。
先程のターミナル(コマンドプロンプト/shell)に
php artisan migrate
と入力、Enterするだけです。
画像のように、Migration table created successfullyと出れば完了です。
[st-kaiwa3 r]ねぇねぇ、なんか自分が今作ったファイル以外もmigrateされてない!?[/st-kaiwa3]
[st-kaiwa1 r]ああ、このcreate_users_tableとかっていうのは、もともとLaravelに付いてる機能なんだ。さっきの図に出てきたユーザーテーブルと、パスワードをリセットするための情報が書かれたテーブル、エラーを保存しとくテーブルがデフォルトで用意されていて、初回はそれらも一緒にマイグレートされるんだ。実際これらは必要になるから、特にイジらず一緒にマイグレーションすればOKだよ。
[/st-kaiwa1]
実際に、phpMyAdminにログインしてみましょう。
ログインすると、postsやusersというテーブルが追加されてます。postsを選び、構造タブを見てみると、ちゃんとカラムが作成されてるのが分かります。
[st-kaiwa3 r]ねぇ、さっきstringって記入した奴がvarchar(255)ってなってるんだけど・・[/st-kaiwa3]
[st-kaiwa1 r]うん、stringって記入してmigrationすると、SQL上ではvarcharという呼び名になるんだ。後ろの255っていうのは、最大文字数だね。
postの所にはnullable()って付けたから、NULLの所がはいになってるわけ。likesの所は指定通りデフォルト値が0になってるんだ。[/st-kaiwa1]
[st-kaiwa3 r]Auto Incrementっていうのは?[/st-kaiwa3]
[st-kaiwa1 r]自動的に数字を増やすって意味。つまり投稿がある度に、ID1, ID2, ID3って数値を増やしてくれるって意味なんだ。あとUNSIGNEDっていうのは、-5みたいなマイナスの値は使わないよって意味があるよ。[/st-kaiwa1]
LaravelのMigrationに関するよくある疑問、質問
さて、Migration自体は前項までの解説でコンプリートしました。無事専用のデータベースが完成したので、投稿を保存できる状態になりました。(もちろんLaravel側で、投稿フォームなどを設置する必要がありますが。)
さて、ここからは、このMigrationに関するよくある質問に答えていきます。
Migration使わないでも、phpMyAdminでできるんじゃないの?
[st-kaiwa3 r]ねぇ、思ったんだけど、これってわざわざLaravelのファイルに$table->string()みたく書かなくてもさ、phpMyAdmin上でボタンポチポチしてけばテーブルもカラムも作れるんじゃないの?[/st-kaiwa3]
[st-kaiwa1 r]お、気付いたか!その通り。実はそれでも作れる。[/st-kaiwa1]
画像のように、データベース名をクリックすると、テーブルを作成という項目があるので、ここで作れますし、カラムの追加、編集、削除も実は全部phpMyAdminからできます。
[st-kaiwa3 r]なんだ~、じゃあそんなややこしいLaravelのコードで書くより、そのままphpMyAdminでひとつひとつ作った方が簡単じゃん!先にそれを教えてよ!プンプン![/st-kaiwa3]
[st-kaiwa1 r]まぁ、君の言う通りでもあるんだけど、もし君が実際に開発の仕事をやってくなら、Migrationは絶対覚えておいた方がいいよ。[/st-kaiwa1]
なぜわざわざMigrationを使うのかというと、
- 履歴が残る
- 後でサーバーや他のPCにコピーする時にphp artisan migrateと打つだけで完了する
という利点があるからです。
まず、migrationファイルを書く事で、いつテーブルやカラムを追加したかという履歴が残ります。そうする事で、他の人とチームでサイト作りをする時は、お互いがどこをどうイジったかが分かりやすいというメリットがあります。またバグが出た時も、どこをいつイジったかが分かるので、見つけやすいです。
さらにもっと大事な事として、PCでLaravelサイトを作った場合は、後でGITなどを使ってサーバーへアップロードするわけですよね。
その際、migrationファイルをサーバーへコピーして、php artisan migrateと打つだけで、今まで追加したテーブルとカラムが一瞬で全部サーバーのMySQLに作成されるわけです。
→GITとGITHUBとは?全く分からない初心者向けに図入りでやさしく解説!
[st-kaiwa1 r]のちのちPCからサーバーにサイトをまるっとコピーする時に、migrationファイルがあると、データベースの設定もコピーされるから簡単ってわけ。だから出来る限りmigrationファイルを使う事をおすすめするよ。
確かに自分もnullable設定忘れた~みたいな時は、phpMyAdminから直接Nullにチェック入れたりとかはするけどね。でもそれをやると、サーバーにアップした時も、手動でNullにチェックいれる必要があったりで、PC側とサーバー側の設定がチグハグになる可能性があるから気をつけてね。[/st-kaiwa1]
Migrationでカラムを追加したり、削除したい時はどうすればいいの?
[st-kaiwa3 r]ねぇ、今作ったMigrationファイルにカラムを追加して、php artisan migrateしたんだけど、新しいファイルはないですって出て、何も起こらないんだけど・・[/st-kaiwa3]
[st-kaiwa1 r]もしカラムを新たに追加したり、逆に削除したりしたい場合は、新たに追加用のmigrationファイルを作る必要があるんだ。この書き方についてはこの記事で解説してるよ↓
LaravelのMigrationでカラムを追加、編集、削除のやり方。初心者でもよく分かるように解説![/st-kaiwa1]