【EC-CUBE3】独自プラグインでテーブル作成&データ投入をする方法。

プラグインを自作する際、どうしても避けて通れないのが新しいテーブルの作成かと思います。
ただ、テーブルを作成するだけあれば、Symfony2のMigrationを利用して、
upメソッドにcreate tableの記述をすれば良いのですが、
そのまま同じファイルでデータを投入しようとするとエラーが発生します。
例えば、名称とステータスを持つテーブルを新規作成する場合、
以下のような記述を行うと思います。

class Version20161207000000 extends AbstractMigration
{
public function up(Schema $schema)
{
$this->createPluginTable($schema);
}

public function down(Schema $schema)
{
$schema->dropTable(‘plg_shiro8_now_order_config’);
}

protected function createPluginTable(Schema $schema)
{
$table = $schema->createTable(“plg_shiro8_hogehoge_config”);
$table->addColumn(‘id’, ‘integer’, array(
‘autoincrement’ => true,
‘notnull’ => true,
));
$table->addColumn(‘name’, ‘text’, array(‘notnull’ => true));
$table->addColumn(‘status_flg’, ‘smallint’, array(
‘notnull’ => true,
‘unsigned’ => false,
‘default’ => 0,
));
$table->addColumn(‘rank’, ‘integer’, array(
‘notnull’ => true,
‘unsigned’ => false,
‘default’ => 1,
));
$table->addColumn(‘del_flg’, ‘smallint’, array(
‘notnull’ => true,
‘unsigned’ => false,
‘default’ => 0,
));
$table->addColumn(‘create_date’, ‘datetime’, array(
‘notnull’ => true,
‘unsigned’ => false,
));
$table->addColumn(‘update_date’, ‘datetime’, array(
‘notnull’ => true,
‘unsigned’ => false,
));
$table->setPrimaryKey(array(‘id’));

}
}

これで新しくplg_shiro8_hogehoge_configテーブルが作られるのですが、

$table->setPrimaryKey(array(‘id’));

の後ろに、データを追加する為のinsert文を追記するとエラーが起きます。

$this->addSql(“INSERT INTO plg_shiro8_hogehoge_config (creator_id, name, visible_flg, rank, del_flg, create_date, update_date) VALUES (1, ‘商品画像’, 1, 3, 0, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP);”);
$this->addSql(“INSERT INTO plg_shiro8_hogehoge_config (creator_id, name, visible_flg, rank, del_flg, create_date, update_date) VALUES (1, ‘商品名’, 1, 2, 0, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP);”);
$this->addSql(“INSERT INTO plg_shiro8_hogehoge_config (creator_id, name, visible_flg, rank, del_flg, create_date, update_date) VALUES (1, ‘売上日時’, 1, 1, 0, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP);”);

これはこのファイル内でデータを追加しようとした時には、
まだplg_shiro8_hogehoge_configテーブルが存在していない事が原因のようです。
詳細はよく分からなかったのですが、SQLが実行される順番にルールがありそうです。

そこでSQLの実行に区切りをつける為、insert文の記述のみ別バージョンのファイルに分けて、
順番に実行させることで対応可能です。

例えば、create tabelの実行を記述するファイルは、「Version20161207000000.php」と命名し、
insertの実行を記述するファイルは、「Version20161208000000.php」とします。

class Version20161208000000 extends AbstractMigration
{
public function up(Schema $schema)
{
$this->addSql(“INSERT INTO plg_shiro8_hogehoge_config (creator_id, name, visible_flg, rank, del_flg, create_date, update_date) VALUES (1, ‘商品画像’, 1, 3, 0, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP);”);
$this->addSql(“INSERT INTO plg_shiro8_hogehoge_config (creator_id, name, visible_flg, rank, del_flg, create_date, update_date) VALUES (1, ‘商品名’, 1, 2, 0, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP);”);
$this->addSql(“INSERT INTO plg_shiro8_hogehoge_config (creator_id, name, visible_flg, rank, del_flg, create_date, update_date) VALUES (1, ‘売上日時’, 1, 1, 0, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP);”);

}

public function down(Schema $schema)
{

}

}

こうする事によって、プラグインインストール時に
Version20161207000000 → Version20161208000000 と順番に実行され、
無事、テーブルに初期データを投入する事が出来ます。
ちなみにインストール時に一気に処理を走らせるために、それぞれのファイル名のyyyymmddの部分は
過去の日付にする必要がありそうです。

以上、ECCUBE3のプラグイン開発時に悩んで、解決した事の1つ、
独自プラグインでテーブル作成&データ投入をする方法になります。