我有以下数据模型
Product: id, description, price
ProductExtraField: id, name
ProductExtraFieldData: product_id, extra_field_id, value
我想使用此数据模型,以便我的应用程序用户可以动态向产品添加额外的属性。假设添加属性"颜色"。当他们这样做时,将在ProductExtraField
表中创建一个行,其值如下:6,"颜色"。现在,可以将此属性的值添加到那里的产品。执行此操作时,将在ProductExtraFieldData
表中创建一个新行,其值如下:4, 6, 'Green'。现在我想在一个名为 Product
的类中表示这个模型。我使用以下代码:
<?php
use DoctrineCommonCollectionsArrayCollection;
/** @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
甚至应该是静态的。如何配置原则以加载这些值?不需要保留 Product
类中的$extraField
值。
也许是像下面这样的结构:
产品
- 编号
- 描述
- 等。。。
产品外场
- product_id
- extra_field_id
- 价值
外场
- 编号
- 标签
- (还有别的吗?
因此,您的Product
将在ProductExtraField
上具有OneToMany映射,该映射将具有ManyToOne
映射到ExtraField
。允许您使用诸如...
$extraValues = array();
foreach ($product->getExtraFields() as $productExtraField) {
$extraValues[$productExtraField->getExtraField()->getLabel()] = $productExtraField->getValue();
}
// builds array such as array('colour' => 'blue', 'size' => 'small)