【ECCUBE4系】マスタデータの扱いについて

ECCUBEには、マスタデータと呼ばれるTBLが存在します。
一部を除くマスタTBLは、管理画面＞設定＞システム設定＞マスタデータ管理画面で確認することができます。
![スクリーンショット 2023-11-10 15.18.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610823/103660de-e126-59d0-ade6-3cfae709e612.png)

確認したいマスタTBLセレクトボックスから選択し、「選択」ボタンを押下するとデータが取得できます。
![スクリーンショット 2023-11-10 15.19.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610823/ebb00c2f-4f8b-7f6a-2619-c60e73eeda7e.png)

マスタTBLに新しくレコードを追加して、選択肢を増やすこともできます。
mtb_product_list_order_by TBLにレコードを追加してみましょう。
mtb_product_list_order_byに登録されている選択肢は、フロント側の商品一覧画面の商品並び替えの機能等で利用されています。

変更前
管理画面
![スクリーンショット 2023-11-10 15.30.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610823/3e4f4dc1-72fe-e98c-5fd6-6b7cbbd1e53c.png)

フロント画面
![スクリーンショット 2023-11-10 15.30.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610823/afdac166-f5e1-32df-ec98-1c5c55bc9cef.png)

変更後
管理画面
![スクリーンショット 2023-11-10 15.32.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610823/9375c52f-b595-5bca-1f8b-84aee435ab8d.png)

フロント画面
![スクリーンショット 2023-11-10 15.32.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610823/e3dc9ec1-39a5-cc4e-77d8-b8faa7a62c19.png)

選択肢がちゃんと増えているのが確認できました。
しかし、これだけでは例に挙げた商品検索機能はうまく動作しません。
src/Eccube/Repository/ProductRepository.phpの185行目周辺を確認してみましょう。
```php
        if (!empty($searchData['orderby']) && $searchData['orderby']->getId() == $config['eccube_product_order_price_lower']) {
            // @see http://doctrine-orm.readthedocs.org/en/latest/reference/dql-doctrine-query-language.html
            $qb->addSelect('MIN(pc.price02) as HIDDEN price02_min');
            $qb->innerJoin('p.ProductClasses', 'pc');
            $qb->andWhere('pc.visible = true');
            $qb->groupBy('p.id');
            $qb->orderBy('price02_min', 'ASC');
            $qb->addOrderBy('p.id', 'DESC');
        // 価格高い順
        } elseif (!empty($searchData['orderby']) && $searchData['orderby']->getId() == $config['eccube_product_order_price_higher']) {
            $qb->addSelect('MAX(pc.price02) as HIDDEN price02_max');
            $qb->innerJoin('p.ProductClasses', 'pc');
            $qb->andWhere('pc.visible = true');
            $qb->groupBy('p.id');
            $qb->orderBy('price02_max', 'DESC');
            $qb->addOrderBy('p.id', 'DESC');
        // 新着順
        } elseif (!empty($searchData['orderby']) && $searchData['orderby']->getId() == $config['eccube_product_order_newer']) {
            // 在庫切れ商品非表示の設定が有効時対応
            // @see https://github.com/EC-CUBE/ec-cube/issues/1998
            if ($this->getEntityManager()->getFilters()->isEnabled('option_nostock_hidden') == true) {
                $qb->innerJoin('p.ProductClasses', 'pc');
                $qb->andWhere('pc.visible = true');
            }
            $qb->orderBy('p.create_date', 'DESC');
            $qb->addOrderBy('p.id', 'DESC');
        } else {
            if ($categoryJoin === false) {
                $qb
                    ->leftJoin('p.ProductCategories', 'pct')
                    ->leftJoin('pct.Category', 'c');
            }
            $qb
                ->addOrderBy('p.id', 'DESC');
        }
```

```php
$searchData['orderby']->getId()
```
ここでは、先ほどmtb_product_list_order_byに登録したIDが、1・2・3の時はデータの並び替え処理（Order By）の処理が記載されていますが、新規で追加したID4は処理が存在しません。

その為、QueryCustomizerを利用して、先ほどmtb_product_list_order_byに登録したID4のためのOrderByの処理を追加してあげなければなりません。

```php
<?php

namespace Customize\Repository\Customizer;

use Doctrine\ORM\QueryBuilder;
use Eccube\Doctrine\Query\QueryCustomizer;
use Eccube\Repository\QueryKey;

class ProductSearchCustomizer implements QueryCustomizer
{
    /**
     * @inheritDoc
     */
    public function customize(QueryBuilder $builder, $params, $queryKey)
    {
        if (!empty($searchData['orderby']) && $searchData['orderby']->getId() == 4) {
            if ($this->getEntityManager()->getFilters()->isEnabled('option_nostock_hidden') == true) {
                $qb->innerJoin('p.ProductClasses', 'pc');
                $qb->andWhere('pc.visible = true');
            }
            $qb->orderBy('p.create_date', 'ASC');
            $qb->addOrderBy('p.id', 'ASC');
        }
    }

    /**
     * @inheritDoc
     */
    public function getQueryKey()
    {
        return QueryKey::PRODUCT_SEARCH;
    }
}
```

こんな感じでしょうか。。。？
マスタデータは不用意に編集してしまうと、思わぬ不具合を引き起こしてしまう場合があります。
管理画面から修正するよりは、マイグレーションファイルを作成して、追加したマスタデータの履歴がわりにgitにpushしておくと、より安心ですね。

今回は、ECCUBE4系におけるマスタデータのお話でした。