eccube

EC-CUBE3の外部キー制約に立ち向かう方法

EC-CUBE3はORMを使っていることもあり外部キー制約がバリバリ使われています
それがいいことなのかどうなのかは今のところ恩恵を受けていないのでよくわかりませんがデメリットはとても感じています

MySQLの場合

外部キー制約を一時的に無効にしてしまえば、データの一括削除・投入がやりやすい

~~~
$em = $app[‘db’];
$em->exec(‘SET FOREIGN_KEY_CHECKS = 0;’);

// ここで一括処理する

$em->exec(‘SET FOREIGN_KEY_CHECKS = 1;’);
~~~

ついでに、MySQL5.6以降は色々めんどくさいので以下も追加しておくと楽ですね

~~~
$em->exec(“SET SESSION sql_mode = ””);
~~~

PostgreSQLの場合


外部キー制約を無効にするにはスーパーユーザー権限がいるっぽいのでそういったことは出来なさそう
なので、外部キー制約に縛られたまま頑張ります。。。


とりあえず一括削除はこんなんで出来そう
$em->exec(‘TRUNCATE TABLE ‘ . $tableName . ‘ CASCADE;’);

追記


TRUNCATE TABLE ‘ . $tableName . ‘ CASCADE;
は影響範囲が読めなくてダメぽい、、、PostgreSQLの時はreplace使うしかないか・・・?

これで一時的に無効にすることが出来そう・・・?

~~~
$em->exec(“SET session_replication_role = replica;”);
~~~

How do I temporarily disable triggers in PostgreSQL? – Stack Overflow

疑問

せっかくDoctrine2を使っているのにこういう痒い部分には手が届かないんだろうか?
EC-CUBE3が痒いところに手が届くアプリケーションになっていくしかないのかな〜

この辺知らないと商品IDをリセット出来ないってのもなんだかなーと思う今日このごろなのでした