2017-09-06 87 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