EC-CUBEでは商品や受注のIDは登録を行うと自動で連番が設定されます。ただ、EC-CUBEでのサイトリニューアルや2系からのアップデートの際に商品IDを変えたくないケースがよくあります。
今回はこの商品や受注などエンティティのIDを指定して登録する方法をご紹介します。

商品であれば、管理画面から新規登録した時も、CSVなどで一括登録した場合もIDは連番が自動で登録されます。
受注であれば、カートから注文を受けた時も、受注管理から新規登録した場合もIDは連番が自動で登録されます。

なぜ商品のIDは連番になるのか?

これはエンティティに対してDoctrineの定義としてIDを自動採番するstrategyが設定されているためです。
例えば3系であればsrc/Eccube/Resource/doctrine/Eccube.Entity.Product.dcm.ymlと言うYamlファイルでAUTOが指定されています。

  id:
    id:
      type: integer
      nullable: false
      unsigned: false
      id: true
      column: product_id
      generator:
        strategy: AUTO

4系であればsrc/Eccube/Entity/Product.phpでアノテーションによりIDENTITYが指定されています。

        /**
         * @var integer
         *
         * @ORM\Column(name="id", type="integer", options={"unsigned":true})
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="IDENTITY")
         */
        private $id;

これらの指定によってシステムはデータベース上の連番を採番します。

商品のIDを指定して登録する方法

セッター(setId)を作成

IDを指定するためにsrc/Eccube/Entity/Product.phpへsetIdメソッドを追加しておきます。

    /**
     * @see 
     * @param int $id
     * @return Product
     */
    public function setId($id)
    {
        $this->id = $id;
        return $this;
    }

IDを登録したい画面で自動採番を無効にする

商品登録画面やCSVのインポート画面で下記の適用を行っておきます。エンティティの設定自体を変更してもいいのですが、サイト全体でStrategyが変わるため思わぬ影響が起こる場合があります。
そういった理由から、IDを設定したい画面のControllerでだけ適用を行うのが良いと思います。

        $metadata = $app['orm.em']->getClassMetaData(\Eccube\Entity\Product::class);
        $metadata->setIdGeneratorType(\Doctrine\ORM\Mapping\ClassMetadata::GENERATOR_TYPE_NONE);
        $metadata->setIdGenerator(new \Doctrine\ORM\Id\AssignedGenerator());

上の記述によりsetIdメソッドで登録した値が採用されるようになるため、IDをフォームやCSVから渡してsetIdメソッドを実行することで商品IDを自由に指定することが可能となります。
(フォームを追加する方法等はよくご紹介していますので今回は記載しません。)

EC-CUBEでのサイトリニューアルや2系からのアップデートの際に商品IDをそのまま維持したい場合は非常に有効な手段ですのでぜひご活用ください。


EC-CUBE4系プラグイン