我们正在使用Silex和Doctrine(ODM)开发API,我们有对象Story
,它们具有属性images
。
class Story extends AbstractDocument
{
/** @MongoDB\Id */
protected $id;
/**
* @MongoDB\ReferenceMany(
* targetDocument="MyNamespace\Documents\Image",
* storeAs="DBRef"
* )
*/
protected $images = [];
// Other properties and methods
}
我们在存储库中获取方法(在AbstractRepository中,从中扩展所有其他存储库)。
public function get(string $documentId) : array
{
$document = $this->createQueryBuilder()
->field('id')->equals($documentId)
->hydrate(false)
->getQuery()
->toArray();
}
此方法返回嵌入和引用的对象,但对于referenceMany
,仅返回没有数据的ID。
是否可以拒绝延迟加载以获取所有文档?
我们发现了一种可能的解决方案 - 重写方法toArray
。
答案 0 :(得分:0)
只要您使用->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;
}