将表值加载到对象变量中而不进行映射

时间:2012-09-20 15:48:20

标签: php orm doctrine doctrine-orm

我有以下数据模型

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值不是必需的。

1 个答案:

答案 0 :(得分:0)

也许是以下结构:

<强>产品

  • ID
  • 描述
  • 等...

<强> ProductExtraField

  • PRODUCT_ID
  • extra_field_id

<强> ExtraField

  • 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)