2017-09-06 88 views
0

我们正在使用Silex和Doctrine(ODM)开发API,并且我们有对象Story,它们的属性为images是否可以禁用ODM Doctrine的延迟加载?

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仅返回IDS而没有数据。

是否可以拒绝延迟加载来获取所有文档?

一个可能的解决方案,我们发现 - 重写方法toArray

+0

肯定。您只需将所需的对象添加到select子句。很多例子。我承认我没有使用odm的查询生成器,但我认为它会起作用。我不确定抽象的东西。 – Cerad

+0

@Cerad请你提供一个例子,因为我在教条网站上找到了 'Reference许多文件将始终作为集合来处理,以允许延迟加载,而不管所选择的策略如何。' – yAnTar

+0

希望我可以但我其实不会有一个ODM测试案例。我会认为 - > select('story','image')会诀窍,但我其实不知道。你可能需要明确地加入故事和图像。 – Cerad

回答

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; 
} 
+0

是的,我知道这种方法。为什么我不喜欢它,因为我需要为每个存储库编写它(现在我没有太多它,但将来有可能),它们具有ReferenceMany关系。 我认为该原则提供了解决方案。 – yAnTar

+0

好吧,它集合了开箱即用,但你明确告诉它不是通过请求原始数据。 – malarzm