暇なときに予定を探せるアプリyoteiPickerをリリースしました。
実務でLaravelを使うにあたり、マイグレーションはよく操作するので、チートシートを用意しました。
#マイグレーションのコマンド一覧
・マイグレーションがrunしているかステータスを確認
$ php artisan migrate:status
・マイグレーションの実行
$ php artisan migrate
・ロールバック
$ php artisan migrate:rollback
・マイグレーションファイルの新規作成
$ php artisan make:migration create_テーブル名_table --create=テーブル名
例:
$ php artisan make:migration create_tests_table --create=tests
・既存テーブルにカラムを追加
$ php artisan make:migration add_カラム名_to_テーブル名 --table=テーブル名
例:
$ php artisan make:migration add_email_to_tests_table --table=tests
・既存テーブルのカラムを削除
$ php artisan make:migration drop_カラム名_to_テーブル名 --table=テーブル名
例:
$ php artisan make:migration drop_email_to_tests --table=tests
詳細に解説
【事前準備】
■今回は練習用にtestsテーブルを作成。
■開発環境
Laravel6系、mysql5.7,ツールはphpMyAdmin
# マイグレーションファイルの作成
$ php artisan make:migration create_テーブル名_table --create=テーブル名
--createテーブル名
は任意ですが、このオプションをつけることによって、「データベースに--create=テーブル名で指定したテーブルを作成する」という指示になります。
似たオプションで、--tableがありますが、こちらはすでにテーブルがある時に使います。
--tableオプションをつけることで、「データベースの--table=テーブル名で指定したテーブルを使用する」となります。
testsファイルの作成
$ php artisan make:migration create_tests_table --create=tests
マイグレーションファイルが作成されます。
※まだ$ php artisan migrate
を実行していないので、データベースにテーブルは作成されません。
ファイル作成される場所:
database>migrations>マイグレーションファイル
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateTestsTable extends Migration
{
public function up()
{
Schema::create('tests', function (Blueprint $table) {
$table->increments('id');
$table->timestamps();
});
}
public function down()
{
Schema::dropIfExists('tests');
}
}
マイグレーションファイルを編集する
今回は、sampleテーブルでnameカラムを持たせるのみにします。
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateTestsTable extends Migration
{
public function up()
{
Schema::create('tests', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->timestamps();
});
}
public function down()
{
Schema::dropIfExists('tests');
}
}
マイグレーションの実行
※実行することで、マイグレーションファイルを編集した内容が反映され、データベースにもテーブルが作成される。
$ php artisan migrate
これで、データベースにテーブルが作成される。
既存テーブルにカラムを追加
マイグレーションファイルを作成してテーブルも作成できたけど、やっぱりカラムを追加したい!って思う時もあります。しかし、先程のマイグレーションファイルを再度編集して$ php artisan migrate
を実行してもカラムは追加できません。
じゃあどうすればいいのか。
方法は、カラム追加用のマイグレーションファイルを作成するです。
例えば、sampleテーブルにemailカラムを追加したい!ってなったときのやり方。
php artisan make:migration add_email_to_tests_table --table=tests
--table
オプションをつけることによって、変更したいテーブルを指定できます。
カラム追加用のマイグレーションファイルが新たに作成される
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class AddEmailToTestsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('tests', function (Blueprint $table) {
//
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('tests', function (Blueprint $table) {
//
});
}
}
追加するカラムをマイグレーションファイルに記述
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class AddEmailToTestsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('tests', function (Blueprint $table) {
//カラム追加
$table->string('email', 255)->after('name');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('tests', function (Blueprint $table) {
//カラムの削除
$table->dropColumn('email');
});
}
}
マイグレートを実行。
$ php artisan migrate
データベースにemailカラムが追加される。
マイグレーションファイルの削除
マイグレーションファイルを作成したけど、テーブルを削除したいとかあると思います。
そんな時は以下の方法を試してみましょう。
①マイグレートを実行していない場合
データベースにもテーブルは作成されていないので、マイグレーションファイルを削除するだけでいいです。
②すでにマイグレートしている場合
データベースにもテーブルが作成されており、マイグレーションファイルを削除しただけだと、次にマイグレートした時にエラーがでます。
マイグレートとは、以下のコマンドを指します。
$ php artisan migrate
なので、方法としては以下です。
パターン①:テーブル削除用のマイグレーションファイルを作成する
データベースにすでにpostsテーブルがあって、migrateも実行している状況だとします。
まずは、dropコマンドでテーブルを削除するマイグレーションファイルを作成しましょう。
php artisan make:migration drop_テーブル名_table --table=データベースに存在するテーブル名を指定
$ php artisan make:migration drop_posts_table --table=posts
これで、database>migrationにあるマイグレーションファイルを見ると、
2021_07_08_10023_drop_posts_table.php って感じでマイグレーションファイルが作成されます。
あとはupメソッドのところにdropの処理を、downのところにcreateの処理を書けばいいです。
つまり、テーブルを作る時の逆になります。
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class DropPostsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::dropIfExists('posts');
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::create('posts', function (Blueprint $table) {
$table->bigIncrements('post_id');
$table->integer('user_id');
$table->string('amount');
$table->timestamps();
});
}
}
実務ではこちらを使うことが多いでしょう。
パターン②:データベースをリフレッシュする。
※データベースを全て自動的にrollbackして、migrateを実行してくれるコマンドです。
php artisan migrate:refresh
refreshした後にrollbackする。
※refreshした後にrollbackすると全てのテーブルをrollbackしてくれます。
php artisan migrate:rollback
以下を実行すると、マイグレーションファイルが動いているかどうか確認できます。
php artisan migrate status
こんな感じで全てrollbackされています。
No | 2014_10_12_000000_create_users_table | |
| No | 2014_10_12_100000_create_password_resets_table | |
| No | 2019_08_19_000000_create_failed_jobs_table | |
| No | 2021_06_20_144833_create_categories_table | |
| No | 2021_06_20_144855_create_products_table | |
| No | 2021_06_26_113620_create_sample_table | |
| No | 2021_06_26_123437_add_email_to_sample_table
ここで削除したいマイグレーションファイルを削除します。
今回は練習として、sampleテーブルを作り直したいという想定でやります。
1.sampleのマイグレーションファイルを削除する
※追加したemailカラムのマイグレーションファイルも忘れずに削除する
2.新たにマイグレーションファイルを作成する
3.マイグレートを実行する
1.sampleのマイグレーションファイルを削除する
create_sample...とadd_email...ファイルを削除しましょう。
※特にコマンドとかなくてゴミ箱にポイするだけです。
あとは最初の方で書いたようにマイグレーションファイルを作成します。
※自由にカラムなどを変更して作成してみてください。
そしてphp artisan migrate
を実行しましょう。
新たに作り直したsampleテーブルが作成されます。
マイグレーションの役立つコマンド集
マイグレーションの実行
php artisan migrate
マイグレーションが実行されているかを確認したい場合
実行されていればrun
実行されていない場合はNo
php artisan migrate:status
マイグレーションのロールバック
php artisan migrate:rollback
最後の5つのマイグレーションをロールバックしたいとき
php artisan migrate:rollback --step=5
すべてのマイグレーションをロールバック
php artisan migrate:reset
もしこの記事が役に立ったという場合は、LGTMまたはストックをお願いします。
>>フリーランスも対象!エンジニア転職におすすめなサイト5選
暇なときに予定を探せるアプリyoteiPickerをリリースしました。