8

每当我将 ArrayCollection 与 Doctrine ORM(2.3,PHP > 5.4)一起使用,并将对象值与集合中的键相关联(例如使用该set方法时)时,这些值都会正确存储在数据库中。但是当我想从实体中检索集合时,键不会被检索,而是使用数字索引。

例如,如果我有以下课程:

/** @Entity */
class MyEntity
{
    /** @OneToMany(targetEntity="MyOtherEntity", mappedBy="mainEntity") */
    private $myArray;

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

    public function addOtherEntity($key, $value)
    {
        $this->myArray->set($key, $value);
    }

    ...
}

/** @Entity */
class MyOtherEntity
{
    /** @ManyToOne(targetEntity="MyEntity", inversedBy="myArray") */
    private $mainEntity;
    ...
}

set方法可以正常工作,但是当我检索信息时,其中的键$myArray已经消失了。

如何让 ORM 正确记住密钥?事先谢谢你。

4

1 回答 1

8

这是通过以下方式解决的:

/** @Entity */
class MyEntity
{
    /** @OneToMany(targetEntity="MyOtherEntity", mappedBy="mainEntity", indexBy="key") */
    private $myArray;

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

    public function addOtherEntity($key, $value)
    {
        $this->myArray->set($key, $value);
    }

    ...
}

/** @Entity */
class MyOtherEntity
{
    /** @ManyToOne(targetEntity="MyEntity", inversedBy="myArray") */
    private $mainEntity;

    /** @Column(name="MyOtherTable_Key", type="string", unique=true, length=50)
    private $key;
    ...
}

您还需要MyOtherTable_Key在您的数据库架构中,以便它可以正确存储密钥。

请记住始终将对象键设置到属性中。一种方法是在构造函数中声明键。

public function __construct($key)
{
    $this->key = $key;
}
于 2013-06-27T07:08:02.200 回答