1

Doctrine MongoDB を使用して ObjectId のみを知っているオブジェクトを照会するにはどうすればよいですか? ID によるクエリを使用$dm->findOneBy(array('id' => $id))すると、識別されたドキュメント タイプの 1 つの結果のみが返されますが、その他のドキュメント タイプは返されません。コマンド ライン経由でクエリを実行すると、たとえばdb.documents.find({ "_id": ObjectId(...) });、期待される行が返されます。

編集:問題は、クエリしているドキュメントのタイプがわからず、カスタム リポジトリを使用している場合、使用されるドキュメント名が、 2 つのドキュメント クラス (したがって、他の種類のドキュメントでは 0 の結果が返されます)。探しているドキュメントの種類がわからない場合、Doctrine はどのようにすればよいのでしょうか? 識別されたコレクションが与えられた場合、教義を明示的に伝えずに、リポジトリで正しいドキュメント名を自動的に使用する方法はありますか?

問題の抽象化については、以下を参照してください。

ありがとう!


私は、同じ文書コレクション内に、type分野によって識別された、識別された一連の文書を持っています。

{
  "_id" : ObjectId("510fdb6c91a4cb4c25000000"),
  "name" : "Contract",
  "type" : "document"
}
{
  "_id" : ObjectId("510fdb6c91a4cb4c25000001"),
  "name" : "Tutorial",
  "length_min": "60"
  "type" : "video"
}
...

Documentとクラスの両方のマッピングはVideo次のようになります。

<!-- "Doc" Document mapping -->
<doctrine-mongo-mapping ...>
  <document name="Doc" collection="documents" repository-class="DocRepository">
    <discriminator-field fieldName="type" />
    <discriminator-map>
      <discriminator-mapping value="document" class="Doc" />
      <discriminator-mapping value="video" class="Video" />
    </discriminator-map>

    <field fieldName="id" id="true" />
    <field fieldName="name" field="name" type="string" />
  </document>
</doctrine-mongo-mapping>

<!-- "Video" Document mapping -->
<doctrine-mongo-mapping ...>
  <document name="Video" collection="documents" repository-class="DocRepository">
    <discriminator-field fieldName="type" />
    <discriminator-map>
      <discriminator-mapping value="document" class="Doc" />
      <discriminator-mapping value="video" class="Video" />
    </discriminator-map>

    <field fieldName="id" id="true" />
    <field fieldName="name" field="name" type="string" />
    <field fieldName="length_min" field="length_min" type="int" />
  </document>
</doctrine-mongo-mapping>
4

2 に答える 2

1

あなたの場合、上記のSean Quinnのような追加のラッパーリポジトリを作成することに頼らずに、1つの解決策しか見られません。

識別されるすべてのドキュメントに 1 つのコレクションを使用します。保存するすべてのクラスの基本クラスがない場合は、抽象クラスを追加します。継承マッピングに関する Doctrine のドキュメントで説明されています。簡単に言うと、コレクションを 1 つだけ使用し、いくつかのフィールドは格納されたオブジェクトのクラスを通知し、このリポジトリにクエリを実行した後、適切なクラスのオブジェクトを取得します。

単一コレクションの継承マッピングを使用するinheritance-type="SINGLE_COLLECTION"には、最上位クラスのdocumentタグに属性を追加します。

于 2013-02-25T09:37:46.617 に答える
1

この問題に対して私が思いついた2つの解決策は次のとおりです。

  1. 作業を行っている実際の抽象化されたリポジトリの単なるラッパーであるさまざまなリポジトリを作成する。これにより、依存性注入のオーバーヘッドが発生します。
  2. 適切なタイプのオブジェクトを照会できるように、クラス名修飾子を使用して共有リポジトリを取得します。

どちらのソリューションでも、適切なクラスを派生できるように、クラス名 (または少なくともその型) を知る必要があります。

于 2013-02-14T17:55:30.370 に答える