商売力開発ブログ

非エンジニアがWebサービスの開発、運営によって商売力をつける記録、その他の雑記

Laravelのマイグレーション機能の活用⑤ 複数テーブルに同じカラムを追加する

【スポンサーリンク】

今回はPHPフレームワークの一つのLaravelの中から、データベースのマイグレーションの機能の利用に当たって、我々の活用方法を紹介します。
今回利用するDBはMySQLですが、一部については他のDBでもほぼ同様に対応できます。
またマイグレーションに関連する内容は以下を参照して下さい。

Laravelのデータベースのマイグレーション機能 順番を強引に入れ替えることも可能 - 商売力開発ブログ
Laravelのマイグレーション機能の活用① メンバ変数を追加した上でテーブルのコメント追加も簡単に設定する方法 - 商売力開発ブログ
Laravelのマイグレーション機能の活用② 1つのファイルで複数のテーブル管理も可能 - 商売力開発ブログ
Laravelのマイグレーション機能の活用③ カラム定義の管理を楽にする方法 - 商売力開発ブログ
Laravelのマイグレーション機能の活用④ カラム定義のメソッド設定例 - 商売力開発ブログ

カラム共通設定用のメソッドを使用してのカラムの追加

前回までの記事で説明したように、カラム名を指定することで定義を設定できるようなLaravelのファサードのメソッドを今回も利用します。

MigrationFunc::columnDef($table,'column_name');

このMigrationFuncファサードのメソッドの引数は以下のようなもので、nullableやデフォルト値の設定もできるものです。詳しくはこちらを参照して下さい。

public function columnDef(Blueprint $table,$column_name,$nullable_flg=false,$default=null)

今回は複数のテーブルに対して、同じカラムを追加する場合の対応を行います。ほぼ同じ構成のテーブルに対して行うイメージとなります。
まずはマイグレーションファイルに、テーブル名と追加するカラム名を設定します。今回はMySQLのみだけで利用できるafterのカラムも設定しています。

    public $tbl_array=array('tbl_name_1','tbl_name_2','tbl_name_3');
    public $add_col_name='add_colomn';
    public $aft_col_name='after_column';//MySQLのみ

これらのプロパティ(メンバ変数)を利用してupメソッドとdownメソッドを設定していきます。
またテーブルへの変更の場合、Schema::tableを使用して設定します。

Schema::table($tbl_name, function (Blueprint $table) {
    MigrationSet::columnDef($table,$this->add_col_name);
});

upメソッドの設定

upメソッドでは、追加対象のテーブル配列をforeachで処理するようにします。処理をする前に追加対象のテーブルが存在することと、そのテーブルに追加対象のカラムがないことをチェックすることが可能です。

if(Schema::hasTable($tbl_name) && !Schema::hasColumn($tbl_name,$this->add_col_name))

MySQLの場合、afterの設定によって特定のカラムの後に追加が可能です。こちらも追加対象のテーブルにafter対象のカラムがあることをチェックすることが可能です。

if(Schema::hasColumn($tbl_name,$this->aft_col_name))

ある場合はafterを設定し、ない場合はafterを設定しないようにします。
MigrationFunc::columnDefの設定により、afterを続けて設定することができます。

MigrationSet::columnDef($table,$this->add_col_name)->after($this->aft_col_name);

これらをまとめたupメソッドは以下のようになります。

    public function up()
    {
        foreach($this->tbl_array as $key => $tbl_name){
            if(Schema::hasTable($tbl_name) && !Schema::hasColumn($tbl_name,$this->add_col_name)){
                if(Schema::hasColumn($tbl_name,$this->aft_col_name)){
                    //MigrationSet後にafterを実行
                    Schema::table($tbl_name, function (Blueprint $table) {
                        MigrationSet::columnDef($table,$this->add_col_name)->after($this->aft_col_name);
                    });
                }else{
                    //afterなし
                    Schema::table($tbl_name, function (Blueprint $table) {
                        MigrationSet::columnDef($table,$this->add_col_name);
                    });
                }
            }
        }   
    }

こちらを実行すると、追加対象のテーブルに同じカラムが追加することができます。

downメソッドの設定

downメソッドでも、追加対象のテーブル配列をforeachで処理するようにします。処理をする前に追加対象のテーブルが存在することと、そのテーブルに追加対象のカラムがあることをチェックすることが可能です。

if(Schema::hasTable($tbl_name) && Schema::hasColumn($tbl_name,$this->add_col_name))

downメソッドでは追加したカラムの削除を行います。カラムの削除はdropColumnで行います。

$table->dropColumn($this->add_col_name);

これらをまとめたdownメソッドは以下のようになります。

    public function down()
    {
        foreach($this->tbl_array as $key => $tbl_name){
            if(Schema::hasTable($tbl_name) && Schema::hasColumn($tbl_name,$this->add_col_name)){
                Schema::table($tbl_name, function (Blueprint $table) {
                    $table->dropColumn($this->add_col_name);
                });
            }
        }
    }

こちらを実行すると、追加対象のテーブルに追加したカラムを削除することができます。

まとめ

今回はLaravelのマイグレーションの我々の活用方法のうち複数テーブルへの同じカラムの追加方法を紹介しました。

以上

【関連するリンク】 www.prj-alpha.biz www.prj-alpha.biz www.prj-alpha.biz www.prj-alpha.biz www.prj-alpha.biz

【スポンサーリンク】