カテゴリー
EC-CUBE

【EC-CUBE4】EC-CUBE2からデータ移行

バージョンは「2.11」からの結構カスタマイズされているサイトの移行となります。

どのように移行する?

特にDBの項目増やしたり、プラグインを入れたりしてなければ、データ移行プラグインで最低限移行できる。

データ構成を把握していて、SQLで変換スクリプトを作成して移行しても問題はない。

今回は、データ移行プラグインをカスタマイズして対応した。

2系のデータが多すぎてdumpで落ちる場合

サーバーのスペックにもよるが、dtb_order_detailで5万件以上+その他諸々でサーバー落ち

結局テーブル毎に一覧を取得し、データ移行プラグイン用にcsvを作成し対応

受注明細の消費税のズレ

税率が基本情報で設定されるので、受注明細に設定されているものを優先するように変更

app/Plugin/DataMigration4/Controller/Admin/ConfigController.php

PHP
// 2.4.4, 2.11, 2.12
if (isset($this->baseinfo) && !empty($this->baseinfo)) {
    // $value['tax_rate'] = $data['tax_rate'] = $this->baseinfo['tax'];
    // 商品別税率設定へ対応_dtb_order_detailの[tax_rule]があればそのまま移行
    $value['tax_rate'] = $data['tax_rate'] ? $data['tax_rate'] : $this->baseinfo['tax'];
    $data['point_rate'] = $this->baseinfo['point_rate'];
}

商品別税率機能

2系から移行すると「dtb_tax_rule」テーブルのproduct_class_idが設定されていないので、うまく表示できない

対応方法

商品規格を使用していなければ、productに対してproduct_classが1つなので、対象を取得してアップデートする

カスタムするコードのヒント

app/Customize/Repository/ProductClassRepository.phpへメソッドの追加

PHP
public function getTranslationData()
{
    $qb = $this->createQueryBuilder('pc');
    $qb->select('IDENTITY(pc.Product) AS product_id, pc.id AS product_class_id');
    return $qb->getQuery()->getArrayResult();
}

app/Plugin/DataMigration4/Controller/Admin/ConfigController.php

作成したメソッド呼び出して、加工して当て込む

PHP
/** @var array $productData */
$productData = $this->productClassRepository->getTranslationData();
$this->productIdProductClassId = array_column($productData, 'product_class_id', 'product_id');

if ($data['product_id'] != 0) {
    $productId = $data['product_id'];
    if (isset($this->productIdProductClassId[$productId])) {
        $value['product_class_id'] = $this->productIdProductClassId[$productId];
    }
}

改行コード

app/Plugin/DataMigration4/Controller/Admin/ConfigController.php

PHP
/**
 * 改行コードを変換
 */
public function convertToNewlineCode($staring) {
    $convert = [
        '\r' => "\r",
        '\n' => "\n",
    ];
    
    $target = array_keys($convert);
    $replace = array_values($convert);
    
    return str_replace($target, $replace, $staring);
}

/* 下記のような項目は変換が必要な場合もある */
$data['main_list_comment'];
$data['main_comment'];
$data['comment3'];
$data['body'];

作成者: kenshi

ゲーム大好きです。
ApexLegends, Arkやっています。
携帯販売員4年(240万)

プログラマー3年(350万)

フリーランスエンジニア1年(500万)