[st-kaiwa3 r]Laravelのmigrationのやり方は分かったんだけど、カラムを追加したいのに、同じファイルを書き換えても、マイグレーションするファイルが無いって出ちゃってできないんだけど・・[/st-kaiwa3]
テーブル作成時のmigrationファイルを書き換えて、php artisan migrateをやっても、新たなカラムの追加や削除はできません。
というわけで、migrationでカラムを追加、削除、編集する方法を分かりやすく解説します。
*一応この解説はLaravel6をベースに解説しています。
→LaravelのMigrationとは?初心者でも図解で面白いほどよく分かる!
Laravelのmigrationでカラムを追加する方法
例えば、すでにpostsというテーブルがあって、そこに新しいageというカラムを追加したいとします。その場合、
php artisan make:migration add_age_to_posts_table –table=posts
というコマンドを使います。(オレンジ部分を自分にあった形に変更します)。
コマンドを解説すると、
add_age:age(というカラム)をadd(追加)する
_to_posts_table:post テーブルに対して。
という意味があります。
[st-kaiwa3 r]なんか長ったらしいけど、短くadd_ageだけにするとダメなの?[/st-kaiwa3]
[st-kaiwa1 r]実はそれでも動くよ。でもおすすめしない。[/st-kaiwa1]
理由は、
1. 他のテーブルでも同じ名前のカラムを作る事がよくある。その時、クラス名が同じになるのでバグる可能性がゼロではない。
2.ファイル名でパッとどのテーブルに追加した奴なのかが分からない。
[st-kaiwa1 r]そういう理由もあるから、ちゃんとadd_age_to_posts_table とした方がいいよ。[/st-kaiwa1]
そして、必ず –table=posts を付けてください。これがどのテーブルに追加するのかを示しています。postsに追加するので、=postsです。usersなら=usersに変えます。
Laravelプロジェクトフォルダ→database→migrationsと開き、ファイルを開きます。
赤枠のように、追記したいカラム情報を入力し、上書き保存します。
そして、php artisan migrate でEnterすれば完了です。
これで、無事追加できました。
Laravelのmigrationでカラムを削除する方法
[st-kaiwa3 r]あ、今追加したカラム、いろいろ間違えてたから、やっぱ削除したいんだけど。[/st-kaiwa3]
*もし、そのカラムにすでにデータがある場合は、必ずphpMyAdminからデータのバックアップを取ってくださいね。データも消えますので。
そういう場合は、今度は、
php artisan make:migration remove_age_from_posts_table –table=posts
とコマンドを打って、Enterします。(オレンジ文字はご自身のテーブルとカラム名に書き換えてください。)
できたファイルを開きます。
今度は、同じくfunction up() 側に、$table->dropColumn(‘age’); と入力します。
dropColumnというのが、カラム削除コマンドです。
ちなみに、function down()の方にも、カラム作成時に書いたコードを書いておくと、後日、もしロールバックという前の状態に戻す操作を行った際、消したカラムが戻ります。
[st-kaiwa1 r]downっていうのは、あくまでロールバックなどの巻き戻しコマンドを使う時用の欄なんで、それが不要なら、down側は空欄でもOKです。[/st-kaiwa1]
ファイルを上書き保存したら、
php artisan migrate で削除完了です。
[st-kaiwa3 r]あ、やっぱカラム削除しなきゃ良かったなぁ~って時に戻す方法ってあるの?[/st-kaiwa3]
[st-kaiwa1 r]今解説したロールバックを使えば、カラムを戻せるよ。ただし、今話した通り、down側に何も書いてないで使うと、自分が予想した以上に前の状態に戻ってしまう可能性がある(つまり前々回の消したくないマイグレーションまで消えたりするという大事故が起こる)から、かなり注意して使った方がいいよ。正直あまりおすすめしない。
php artisan migrate:rollback
このコマンドを打てば、前のファイルのdownに書かれたコマンドが実行されて、元に戻るよ。元に戻ったら、戻ったファイル以降の日付のファイルはPC内の別のフォルダに移動するなり、消すなりしないと、次migrateした時にまた同じファイルが実行されちゃうから気をつけて。(つまりいろいろややこしい・・)[/st-kaiwa1]
[st-kaiwa3 r]そっか。じゃあ普通に削除後、もしまた同じ名前のカラムを作り直したい時は、カラム追加と同じ操作すれば大丈夫なの?[/st-kaiwa3]
[st-kaiwa1 r]うん、それで大丈夫。一つポイント。一度php artisan migrateしたファイルは、もう一度migrateコマンドを打っても、マイグレーションされない。
だけどファイル名を変えたら、
例えば、2020_10_13_130538_add_age_to_posts_table.phpっていうファイルだったら、先頭に日付と時刻が付いてるわけ。
この日付を、現在時刻に書き換える、例えば、
2020_10_13_130538_add_age_to_posts_table.php
↓
2020_10_13_140538_add_age_to_posts_table.php
みたく、変更すれば、新しいファイルとして認識させる事も可能だよ。(一人で作業してる分にはいいけど、共同作業の場合は、どこをイジったかの履歴が分かりづらくなるのでやらない事。)[/st-kaiwa1]
Laravelのmigrationでカラムを編集する方法
上の説明のように、一度削除して、作り直すって手もありますが、
削除せずに書き換える方法もあるっちゃあります。
ただ、この方法を使うには、doctrine/dbalというLaravelパッケージのインストールが必要です。なので、cdでLaravelプロジェクトフォルダに移動したら、
composer require doctrine/dbal
というコマンドを打って、Enterし、まずdoctrine/dbalをインストールします。(5分程度かかります。)
インストールが完了したら、
php artisan make:migration edit_age_of_posts_table –table=posts
というコマンドを打ち、Enterします。(オレンジ文字はご自身のテーブルとカラム名に書き換えてください。)
ファイルを開きます。
追加の時と同様に、up側に、変更したいカラムの情報を書きます。例えば、この例の場合、さっきはdefault(0)にしましたが、やっぱりdefault(18)にしたいので、そう書き、->change()というコマンドを付け足しました。
例えば、今はintegerだけど、やっぱりstringでnullをありに変更したいなら、
$table->string(‘age’)->nullable()->change();
と入力すればいいって事です。
記入したら、ファイルを上書き保存し、
php artisan migrate
のコマンドを打ち、Enterで完了です。
うまく変更できてるか、phpMyAdminなどで確認してみてください。
[st-kaiwa3 r]ねぇ、この追加、変更、削除ってさ、コマンド打たなくてもphpMyAdminからもできるよね?[/st-kaiwa3]
[st-kaiwa1 r]うん、実はできるよ。まぁ、phpMyAdminからイジると、イジった履歴がmigrationファイルとして残らないから、PCからサーバーにmigrationファイルをアップロードした時に、サーバー側のデータベースにPC側と同じ設定が反映されないって事にはなるね。サーバー側のphpMyAdminでも訂正が必要になるよ。[/st-kaiwa1]
[st-kaiwa3 r]そういうデメリットはあるんだね。[/st-kaiwa3]