[PHP] Laravel5+のマイグレーションで、カラムが存在するかをチェックしてからカラム削除する
Laravelのマイグレーションでカラム削除する際に、カラムが存在するかを事前にチェックする方法を、ブログに書きたいと思います。
マイグレーションの処理が途中で止まると非常に困ります。マイグレーション外でDB変更がされていたとしても、エラーなく処理ができるように、今回の実装を少し取り入れると良いかなーと思います。
https://laravel.com/docs/migrations#tables
最後になりますが本ブログでは、PHP、サーバー、フロントエンド、インフラ、Swift、Node.js、Java、Linux、機械学習、などの技術トピックを発信をしていきます。「プログラミングで困ったその時の、解決の糸口に!」そんな目標でブログを書き続けています。ぜひ、本ブログのRSSやTwitterをフォローして貰えたら嬉しいです ^ ^
最後までご覧頂きましてありがとうございました!
なぜ必要か
例えば、Laravelのマイグレーションでup()
でカラムを追加する場合、down()
でカラム削除を実装します。そして、migrate:rollback
やmigrate:refresh
をする際に、カラム削除に失敗し、処理が途中で止まってしまうということがありました(原因としては例えば、DBを手動で修正してカラムをドロップしていたなど)。マイグレーションの処理が途中で止まると非常に困ります。マイグレーション外でDB変更がされていたとしても、エラーなく処理ができるように、今回の実装を少し取り入れると良いかなーと思います。
カラムの存在チェックをしてから、カラムをdropする
以下のように実装します。public function down() { // カラムが存在することをチェック. if (Schema::hasColumn('users', 'phone')) { // カラムがあれば、そのカラムを削除. Schema::table('users', function (Blueprint $table) { $table->dropColumn('phone'); }); } }上記は
down()
での実装例ですが、up()
でも同様に実装が可能です。公式ドキュメント
hasColumn
の説明は、以下の公式ドキュメントにあります。ご参照ください。https://laravel.com/docs/migrations#tables
最後に
テーブル削除の場合にはSchema::dropIfExists('users');
と書けるので良いのですが、カラムでも同じようなメソッドが用意されたら良いなぁ〜。Laravelはなかなか奥が深いのですが、色々な案件で使っているので、少しずつでもノウハウをアウトプットしていきたいと思います。最後になりますが本ブログでは、PHP、サーバー、フロントエンド、インフラ、Swift、Node.js、Java、Linux、機械学習、などの技術トピックを発信をしていきます。「プログラミングで困ったその時の、解決の糸口に!」そんな目標でブログを書き続けています。ぜひ、本ブログのRSSやTwitterをフォローして貰えたら嬉しいです ^ ^
最後までご覧頂きましてありがとうございました!