ECCUBE4

1対1リレーションについて

EC-CUBE4でリレーションについて、解説を進めます。

リレーションの設定はEntityファイル内で設定し、データベースへと反映させます。

EC-CUBE4のソースコードを見ながら解説していきます。

1対1構成

1対1の構成は、商品規格を管理するdtb_product_classテーブルと商品規格の在庫量を管理するdtb_product_stockテーブルにあります。

ProductClassのEntity

以下のソースコードは262〜267行目の抜粋です。

        /**
         * @var \Eccube\Entity\ProductStock
         *
         * @ORM\OneToOne(targetEntity="Eccube\Entity\ProductStock", mappedBy="ProductClass", cascade={"persist","remove"})
         */
        private $ProductStock;

@ORM\OneToOneで1対1の構成であると書いています。

targetEntityで1対1の構成を取るEntityファイルを指定します。

mappedByで本クラスのProductClassを指定。

cascadeでpersistとremoveを指定。

persistはデータベースに保存する際に使う関数です、productClassを作成する際は、dtb_product_stockも作成する必要があるという事です。

removeはこのProductClassが削除されたら、ProductStockも削除するという事です。

private $ProdutStockでこのテーブルカラムにアクセスする際の変数を宣言します。

ProductStockのEntity

以下のソースコードは、92〜100行目です。

        /**
         * @var \Eccube\Entity\ProductClass
         *
         * @ORM\OneToOne(targetEntity="Eccube\Entity\ProductClass", inversedBy="ProductStock")
         * @ORM\JoinColumns({
         *   @ORM\JoinColumn(name="product_class_id", referencedColumnName="id")
         * })
         */
        private $ProductClass;

inveredByでマッピング先の変数名を指定しています。

@ORM\JoinColumns・・・で、ProductClassと紐つけています。nameでカラム名、referencedColumnNameでdtb_product_classのidと紐つけています。

今回の1対1の構成での違いは、ProdutClass側にcascadeの設定があって、ProductStock側にinversedの設定がある事です。

これは親子関係みたいな形です、ProductClassが作成されるとProductClassを作成する必要があり、削除されると同様に削除される必要があるためです。ProdutStockは単体で作成される事はありません。

そのため、ProdutStock側にProductClassのidを保存しています。

以上です。