Lehre ODM OneToOne bidirektionale Referenz mit RepositoryMethod

8

Wie kann Doctrine ODM verwendet werden, um eine Eins-zu-Eins-bidirektionale Referenz zu erstellen, die bei Verwendung eines anderen Felds als dem Primärschlüssel für die Referenz lazy lädt?

Ich habe zwei Sammlungen in MongoDB mit Dokumenten, Artikel und ArticleMetaData. Für jedes Artikeldokument gibt es eine ArticleMetaData und umgekehrt. (Eine bidirektionale OneToOne-Beziehung.) Aus beiden Gründen müssen die beiden Dokumenttypen in separaten Sammlungen sein. Beide Sammlungen werden von externen Systemen aktualisiert, die keine Kenntnis über die Mongo-IDs haben. Sie enthalten jedoch ein gemeinsames Feld "groupcode", mit dem der richtige Artikel mit seinen Metadaten abgeglichen werden kann.

Ich versuche, Doctrine so zu konfigurieren, dass ich die Metadaten für ein Artikelobjekt und einen Artikel aus seinem Metadatenobjekt bekommen kann, aber ich möchte sie lazy loaded lassen. (Es gibt keine Notwendigkeit, das andere Ende abzufragen, wenn ich es nicht brauche.)

Die Abbildungen sehen folgendermaßen aus:

%Vor%

Und die oben erwähnten Repository-Methoden:

%Vor%

Es scheint alles gut zu funktionieren. Ich kann einen Artikel oder ArticleMetaData abfragen und bekomme die andere Seite, nur ist das Problem: es scheint nicht zu lazy load . Wenn ich nach einem Artikel frage:

%Vor%

Viele Abfragen werden ausgeführt:

%Vor%

Was mache ich falsch? Gibt es eine Möglichkeit, wie ich eine bidirektionale 1: 1-Referenzverknüpfung mit den oben genannten Einschränkungen erreichen kann?

Bearbeiten:

Nachdem ich Rob Holmes 'Antwort gelesen hatte, entfernte ich einen Test in den Repository-Methoden, die das Problem verursacht haben könnten. Leider bleibt das Problem bestehen und es werden immer noch 3 Abfragen ausgeführt, wobei eine (oder höchstens zwei) ausreicht.

    
Xatoo 08.01.2015, 14:33
quelle

2 Antworten

1

Doctrine ODM lädt das referenzierte Dokument bereits, anstatt es für Sie vorab abzurufen.

Ich glaube, dass Ihr Problem tatsächlich in Ihren Repository-Methoden liegt ... Zum Beispiel rufen Sie in der Funktion findOneByMetaData als Erstes $metadata->getArticle() auf. Dabei bitten Sie die Doktrin, den Artikel aus der Datenbank zu laden , was aufgrund Ihrer repositoryMethode findOneByMetaData erneut aufrufen wird. Aus diesem Grund sehen Sie mehrere Abfragen.

Ihre findOneByMetaData -Funktion sollte mehr wie folgt aussehen:

%Vor%

Doctrine kümmert sich darum, ob der Artikel bereits geladen wurde, also müssen Sie nicht nach einem Nullwert suchen. Dasselbe gilt auch für Ihre findOneByArticle Funktion.

Ich hoffe, das macht Sinn und hilft Ihnen, Ihr Problem zu lösen.

    
Rob Holmes 18.01.2015 00:04
quelle
1

Dies liegt an Logger (loggableCursor), es dupliziert Abfragen in der Protokolldatei. Zum Beispiel rufen Sie ... find () - & gt; limit (1) - & gt; getQuery () Es protokolliert jeden Aufruf, aber tatsächlich gibt es eine einzelne Abfrageanforderung.

Weitere Informationen: Ссылка

ODM-Problem: Ссылка

    
ScorpioT1000 20.01.2015 08:53
quelle