我们正在开发带有Silex和Doctrine(ODM)的API,我们有对象Story
,它具有属性images
。
class Story extends AbstractDocument
{
/** @MongoDBId */
protected $id;
/**
* @MongoDBReferenceMany(
* targetDocument="MyNamespaceDocumentsImage",
* storeAs="DBRef"
* )
*/
protected $images = [];
// Other properties and methods
}
我们在存储库中有get方法(在AbstractRepository中,从中扩展所有其他存储库)。
public function get(string $documentId) : array
{
$document = $this->createQueryBuilder()
->field('id')->equals($documentId)
->hydrate(false)
->getQuery()
->toArray();
}
此方法返回嵌入和引用的对象,但对于referenceMany
仅返回没有数据的 id。
是否可以拒绝延迟加载以获取所有文档?
我们发现的一种可能的解决方案 - 重写方法toArray
.
一旦你使用->hydrate(false)
你就指示ODM离开你,从MongoDB返回原始数据。您将referenceMany
视为 id 数组,因为这是原始表示形式,不涉及延迟加载。
解决问题的最干净方法是实现StoryRepository
这将触发额外的查询以获取引用的图像:
public function get(string $documentId) : array
{
$document = $this->createQueryBuilder()
->field('id')->equals($documentId)
->hydrate(false)
->getQuery()
->toArray();
$document['images'] = /* ... */;
return $document;
}