2017-09-06 14 views
0

私たちはSilexとDoctrine(ODM)でAPIを開発しており、オブジェクトStoryを持っています。これらのオブジェクトはimagesです。ODM Doctrineの遅延ロードを無効にすることはできますか?

リポジトリ内のメソッドを取得しています(AbstractRepositoryでは、他のすべてのリポジトリを継承しています)。

public function get(string $documentId) : array 
{ 
    $document = $this->createQueryBuilder() 
     ->field('id')->equals($documentId) 
     ->hydrate(false) 
     ->getQuery() 
     ->toArray(); 
} 

この方法でオブジェクトを埋め込み、参照戻るが、データなしのIDのみreferenceMany戻るため。

すべてのドキュメントを取得するためにレイジーローディングを拒否することはできますか?

考えられる解決策 - 書き換え方法toArray

+0

確かに。 select句に必要なオブジェクトを追加するだけです。多くの例。私はodmでクエリビルダーを使用していないことを認めますが、うまくいくと思います。抽象的なものについてはわかりません。 – Cerad

+0

@Cerad Doctrineサイトで見つかったので、例を挙げてください。 'ReferenceManyドキュメントは、選択した戦略に関係なく、遅延読み込みを可能にするコレクションとして常に扱われます。 ' – 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リレーションを持つすべてのリポジトリ(今はそれほど多くはありませんが、将来は可能です)を書く必要があるからです。 私はDoctrineがそれを解決すると考えました。 – yAnTar

+0

これはコレクションの入った箱の外にありますが、あなたは生のデータを要求しないように具体的に指示しています。 – malarzm

関連する問題