私のControllerの拡張方法を説明していきます。
ドキュメント読んで、手順通りに学んだわけではないので参考程度に見てください。
しっかり学びたい人は、Doctrineのドキュメントをお読みください。
Entityの定義
商品クラスで説明
テーブル定義
/** * Product * ↓ これがないとクラス名でテーブルが作成される * @ORM\Table(name="dtb_product") * ↓ クラス階層ごとに1つのテーブルを作成します * @ORM\InheritanceType("SINGLE_TABLE") * ↓ テーブルの識別用カラム * @ORM\DiscriminatorColumn(name="discriminator_type", type="string", length=255) * ↓ サービスの依存関係がないならコールバックの設定をした方が良いとのこと * @ORM\HasLifecycleCallbacks() * ↓ Repositoryの読込み設定 * @ORM\Entity(repositoryClass="Eccube\Repository\ProductRepository") */ class Product extends \Eccube\Entity\AbstractEntity
項目定義
* @ORM\Column(name="id", type="integer", options={"unsigned":true}) * @ORM\Column(name="name", type="string", length=255) * @ORM\Column(name="create_date", type="datetimetz") * @ORM\Id * @ORM\GeneratedValue(strategy="IDENTITY") * @ORM\OneToMany(targetEntity="Eccube\Entity\ProductImage", mappedBy="Product", cascade={"remove"}) * @ORM\ManyToOne(targetEntity="Eccube\Entity\Member") * @ORM\JoinColumns({ * @ORM\JoinColumn(name="creator_id", referencedColumnName="id") * })
データ登録の流れ
- 登録対象Entityの取得 $Product = new Product
- $Product->setName = ‘テスト商品’
- 永続化登録設定 $this->entityManager->persist($Product)
- 登録処理 $this->entityManager->flush($Product)
実際のDBへ登録されるタイミングは、テンプレートに行ってからとか!?
どこかのサイトに書いてあった。
なので実際は登録される前の、Entityのオブジェクトからリスト取得など行ったりしているんじゃないかな٩(•̤̀ᵕ•̤́๑)
リレーションについて
初期表示データ取得できない
カスタマイズ中に発生した問題です。
EC-CUBE4は基本的にDoctrineを使用しています。
データベースをオブジェクト化した物で、都度データベースにアクセスしないでデータの取得や加工が行えます。
なぜこの状態になったか?
取得できなかったデータ
※わかりやすくEC-CUBEデフォルトのテーブルで説明します。
要件:カートの情報をデータ登録直後に一覧ページに表示したい。
関連するテーブルは、dtb_cartとdtb_cart_itemの2種類です。
パターン1
- dtb_cartへEntityで登録+永続化+フラッシュ
- dtb_cart_itemへEntityで登録+永続化+フラッシュ
- findByでリスト取得して、テンプレートへ
パターン2
- dtb_cartへEntityで登録+永続化+フラッシュ
- dtb_cart_itemへEntityで登録+永続化+フラッシュ
- テンプレートでfindByしてリスト取得
上記でうまくいかなかったです。
結局なんだったかと言うと、
リレーションが貼ってあるので、cart→cart_itemの順で登録
cartは最新の登録データは持っているが、紐づくcart_itemは後から登録されるので
cartのEntityに、cart_itemの最新情報が紐づいていない状態
cartのEntityを更新する
$this->entityManager->refresh(XXX); XXXは、更新するEntityオブジェクト $this->entityManager->refresh($cart);
これで解決!