是否可以禁用 ODM 原则的延迟加载?



我们正在开发带有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;
}

相关内容

  • 没有找到相关文章