開発を進めていると、当初と画面が変わったり仕様が変わったりして、不要になったカラムや追加で欲しくなるカラムなどが発生したりします。
設計段階で対応できるのが理想なのですが……
お客様の意向によって、後から仕様が変わるのは結構ありがちですよね
そこで問題になるのが、Laravelのカラムの操作。
Laravelではマイグレーションでテーブルを作成できることは、以前の記事で解説しました。
今回はすでに作成したテーブルにカラムを追加、編集、削除する方法を解説します。
用意したテーブル
名前 | タイプ | その他設定 |
id | int | 主キー |
name | varchar(10) | – |
extension | varchar(5) | – |
created_at | timestamp | – |
updated_at | timestamp | – |
以前作ったテーブルがあったので、そのまま代用してみました。
もし同じテーブルを作って、以後の動作を一緒に行いたい場合は、以下の流れでマイグレーションファイルを作成して編集やコマンドの実行を行ってください。
まずは、以下のコマンドでマイグレーションファイルの作成。
php artisan make:migration create_profiles_table
次に、作成したマイグレーションファイルの編集です。
public function up()
{
Schema::create('profiles', function (Blueprint $table) {
$table->increments('id')->comment('主キー');
$table->string("name", 10)->comment('ユーザー名');
$table->string("extension", 5)->comment('画像の拡張子');
$table->timestamps();
});
}
最後にマイグレーションファイルの実行です。
php artisan migrate
これで、「profiles」テーブルの作成ができました。
マイグレーションを活用してカラムを追加する
では、今回は「profiles」テーブルで実際に行っていきます。
ここで、「開発を進めていると仕様の変更があり、性別(カラム名:gender)の登録も行いたい」ことになった体で話を進めていきます。
やり方は2通りあります。
1つ目はすでに作成した「profiles」テーブルのマイグレーションファイルを編集して、カラムの追加を行う方法です。
しかし、そうするとロールバックする時にテーブルが一旦削除されてしまいます。
データがなくなっても問題ないならいいのですが、今回はデータをそのままにしたいので2つ目の方法をご紹介します。
変更用のマイグレーションファイルの作成
別のマイグレーションファイルを用意するため、次のコマンドを実行します。
php artisan make:migration add_gender_to_profiles_table --table=profiles
–tableオプションでテーブルを指定すると、変更用のマイグレーションが作成できます。
書き方は以下の通りです。
php artisan make:migration add_[追加するカラム名]_to_[テーブル名]_table --table=[テーブル名]
マイグレーションファイルの編集
作成したマイグレーションファイルを編集します。
public function up()
{
Schema::table('profiles', function (Blueprint $table) {
$table->boolean('gender')->comment('性別:0=男性、1=女性'); // カラム追加
});
}
public function down()
{
Schema::table('profiles', function (Blueprint $table) {
$table->dropColumn('gender'); // 失敗した時は戻す
});
}
性別は男女の2パターンを想定しているので、「BOOLEAN」で設定してみました。
down()はロールバック時の処理を記述するので、dropColumnでカラムを消すようにしています。
マイグレーション実行
マイグレーションを実行します。
php artisan migrate
実行した後に、データベースを確認してみます。
無事、カラムの追加ができましたね!
このやり方だと、すでに登録しているデータに影響がでないのでぜひ試してみてくださいね
マイグレーションを活用してカラムを編集する
では次に、カラムの編集をしてみましょう。
ここでは「性別カラムに登録するデータを0と1ではなく、テキストで”男性””女性”と登録できるようにしたい」と要望があった体で説明します。
【最初のみ】ライブラリの追加
Laravelの「doctrine/dbal」というパッケージがないとカラムの編集はできないので、インストールします。
composer require doctrine/dbal
1、2分程で終わります。
変更用のマイグレーションファイルの作成
別のマイグレーションファイルを用意するため、次のコマンドを実行します。
php artisan make:migration change_gender_to_profiles_table --table=profiles
今回はカラムの変更なので、「change」にします。
書き方は以下の通りです。
php artisan make:migration change_[カラム名]_to_[テーブル名]_table --table=[テーブル名]
マイグレーションファイルの編集
作成したマイグレーションファイルを編集します。
public function up()
{
Schema::table('profiles', function (Blueprint $table) {
$table->string('gender')->comment('性別')->change(); // カラムの型変更
});
}
public function down()
{
Schema::table('profiles', function (Blueprint $table) {
$table->boolean('gender')->comment('性別:0=男性、1=女性')->change(); // 失敗した時は戻す
});
}
性別はテキストで登録するように変更するので、「BOOLEAN」から「VARCHAR」に型を変更します。
down()はロールバック時の処理を記述するので、型を戻すように記述しています。
マイグレーション実行
マイグレーションを実行します。
php artisan migrate
実行した後に、データベースを確認してみます。
型が変更できましたね!
ついでにコメントも変更してみましたが、簡単でしたね!
マイグレーションを活用してカラムを削除する
では、最後にカラムの削除の方法を解説します。
「やっぱり性別の項目はいらない!」「(!?)」と仕様変更した体でお話します。
実際にあったら嫌なプロジェクトですね……
変更用のマイグレーションファイルの作成
別のマイグレーションファイルを用意するため、次のコマンドを実行します。
php artisan make:migration remove_gender_from_profiles_table --table=profiles
今回はカラムの削除なので、「remove」にします。
書き方は以下の通りです。
php artisan make:migration remove_[カラム名]_from_[テーブル名]_table --table=[テーブル名]
マイグレーションファイルの編集
作成したマイグレーションファイルを編集します。
public function up()
{
Schema::table('profiles', function (Blueprint $table) {
$table->dropColumn('gender'); // カラムの削除
});
}
public function down()
{
Schema::table('profiles', function (Blueprint $table) {
$table->string('gender')->comment('性別'); // 失敗した時は戻す
});
}
dropColumn()でカラムを削除できます。
down()はロールバック時の処理を記述するので、カラムを戻すように記述しています。
マイグレーション実行
マイグレーションを実行します。
php artisan migrate
実行した後に、データベースを確認してみます。
カラムの削除に成功しました!
さいごに
カラムの追加・編集・削除をマイグレーションで行う方法を解説してきました。
正直、PHPMyAdminなどのツールを使って設定をイジればすぐに終わる作業ではありますが、マイグレーションファイルを作成することで、どんな変更の履歴があったのか把握が容易になるのでおすすめです。
慣れれば簡単なので、ぜひ試してみてください。