0

私は次のデータモデルを持っています

Product: id, description, price
ProductExtraField: id, name
ProductExtraFieldData: product_id, extra_field_id, value

このデータモデルを使用して、アプリケーションのユーザーがその場で製品にプロパティを追加できるようにします。プロパティ「Color」を追加するとします。そうすると、次のProductExtraFieldような値で行がテーブルに作成されます:6、'Color'。これで、このプロパティの値をそこの製品に追加できます。そうすると、次のProductExtraFieldDataような値で新しい行がテーブルに作成されます:4、6、'Green'。ここで、このモデルを。というクラスで表現したいと思いProductます。私は次のコードを使用します:

<?php
use Doctrine\Common\Collections\ArrayCollection;

/** @Entity @Table(name="product") **/  
class Product

    public function __construct() {
        $this->extraFieldData = new ArrayCollection();
        $this->extraField = new ArrayCollection();
    }

    /** @Id @Column(name="id", type="integer") @GeneratedValue **/
    private $id;
    /** @Column(name="description", type="string") **/
    private $description;
    /** @Column(name="price", type="float") **/
    private $price;

    /**
     * @OneToMany(targetEntity="ProductExtraFieldData", mappedBy="product", cascade={"persist"})
     * @JoinColumn(name="product_id", referencedColumnName="id")
     * @var extraFieldData[]
     **/
    protected $extraFieldData = null;

     /**
     * @OneToMany(targetEntity="ProductExtraField", mappedBy="??????")
     * @var extraField[]
     **/
    protected $extraField = null;

オフコース最後の数行は正しくありません。このデータをロードする方法がわかりません。追加のフィールドの名前をすべての製品で使用できるようにしたいと思います。私は$extraField静的であるべきだと思います。これらの値をロードするようにDoctrineを構成するにはどうすればよいですか?$extraFieldクラスからの値を永続化することProductは必須ではありません。

4

1 に答える 1

0

おそらく、次のような構造です。

製品

  • ID
  • 説明
  • 等...

製品追加フィールド

  • 製品番号
  • extra_field_id
  • 価値

エクストラフィールド

  • ID
  • ラベル
  • (他に何か?タイプ?)

したがって、Productに OneToMany マッピングProductExtraFieldがあり、 にManyToOneマッピングされExtraFieldます。次のようなコードを使用できるようにします...

$extraValues = array();
foreach ($product->getExtraFields() as $productExtraField) {
    $extraValues[$productExtraField->getExtraField()->getLabel()] = $productExtraField->getValue();
}

// builds array such as array('colour' => 'blue', 'size' => 'small)
于 2012-09-20T16:10:34.210 に答える