ArrayCollection中的命名集合键

时间:2014-04-03 09:29:08

标签: mongodb doctrine-orm doctrine-odm arraycollection

我正在寻找一种方法来获得 ODM ArrayCollection的关联数组键。

该实体具有以下映射:

/**
 * $fields
 *
 * The entities fields
 *
 * @ODM\ReferenceMany(targetDocument="JobboardEntity\Entity\EntityField", sort={"name"="asc"}, cascade={"all"})
 * @var \Doctrine\Common\Collections\ArrayCollection
 */
protected $fields;

/**
 * addField
 *
 * Add a single field to the field collection
 *
 * @param EntityField $field The field to add
 */
public function addField(EntityField $field)
{
    $this->fields[$field->getFieldName()] = $field;
}

注意在addField方法中,我给该项目的索引为$field->getFieldName()

不幸的是,Doctrine会忘记此密钥并返回带有数字索引的ArrayCollection,而不是之前设置的字符串。

这意味着为了正确实现$this->hasField($fieldName)$this->getField($fieldName),我需要遍历集合并测试fieldName

例如

public function hasField($fieldName)
{
    foreach($this->fields as $field) {
        if ($fieldName === $field->getFieldName()) {
            return true;
        }
    }
    return false;
}

在我的选择中,这是一个糟糕的解决方案,因为我需要加载整个集合才能检查密钥!

拥有looked into the issue我可以看到 ORM this implemented with IndexBy mapping

Doctrine ODM是否有类似的功能?完成此任务的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

查看Collection Strategies

如果您使用@O​​DM \ ReferenceMany(strategy =“set”)(也适用于EmbedMany),该集合将被存储为BSON对象,并且相应的密钥在加载时设置:

我不完全确定数据库本身对性能的影响。我想将该集合存储为BSON对象有点慢,但正如您所说,加载整个集合(以及您正在检查的实体)并不是一件好事,它有助于保持代码更清洁。