[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をフォローして貰えたら嬉しいです ^ ^
最後までご覧頂きましてありがとうございました!





