我正在寻找一种方法来获得 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是否有类似的功能?完成此任务的正确方法是什么?
答案 0 :(得分:1)
如果您使用@ODM \ ReferenceMany(strategy =“set”)(也适用于EmbedMany),该集合将被存储为BSON对象,并且相应的密钥在加载时设置:
我不完全确定数据库本身对性能的影响。我想将该集合存储为BSON对象有点慢,但正如您所说,加载整个集合(以及您正在检查的实体)并不是一件好事,它有助于保持代码更清洁。