Doktrin N + 1-Problem mit verschachtelten Eins-zu-Eins-BeziehungenPhp

PHP-Programmierer chatten hier
Anonymous
 Doktrin N + 1-Problem mit verschachtelten Eins-zu-Eins-Beziehungen

Post by Anonymous »

Ich stoße bei der Verwendung von Doctrine auf das gefürchtete N+1-Problem, insbesondere beim Abrufen von Tabellen mit bidirektionalen Eins-zu-Eins-Beziehungen. Ich verstehe jetzt, dass bidirektionale Eins-zu-Eins-Beziehungen in Doctrine vermieden werden sollten, aber ich arbeite an einer alten Codebasis und möchte so wenig wie möglich ändern, da ich nicht weiß, ob es Nebenwirkungen geben könnte.
Kontext
Ich habe eine Intervention-Tabelle mit einer Viele-zu-Eins-Beziehung zur Benutzer-Tabelle. Die User-Tabelle hat eine Eins-zu-Eins-Beziehung mit der UserIdentity-Tabelle. Die Beziehung wird durch User abgebildet und durch UserIdentity invertiert
Das Problem
Ich stoße auf das N+1-Problem, wenn ich versuche, die Intervention-Tabelle abzufragen und der User-Beziehung beizutreten. Für jeden eindeutigen Benutzer wird eine Abfrage durchgeführt, um eine entsprechende UserIdentity abzurufen. Dies führt zu etwa 1.000 eindeutigen Abfragen.
Ich war schon einmal mit einem ähnlichen Problem konfrontiert und habe es gelöst, indem ich die Umkehrseite der Eins-zu-Eins-Beziehung zu meinem SELECT-Aufruf hinzugefügt und sie mit LEFT JOIN verknüpft habe. In diesem Fall scheint es jedoch nicht zu funktionieren.
Ich vermute, das liegt daran, dass UserIdentity keine direkte Assoziation von Intervention, sondern von User ist.
Was ich versucht habe
So sieht mein Code bisher aus. Ich habe alles gekürzt, was für das Problem irrelevant ist.

Code: Select all

        $alias = "intervention";

$qb = $this->manager
->createQueryBuilder()
->select("partial $alias .{id, uuid, purpose, type, creation, detectorUuid}, intervention_user, trackdechetsIdentity, fibsd")
->from(Intervention::class, $alias)
;

$qb = $qb
->leftJoin("$alias.user", 'intervention_user')
->leftJoin("intervention_user.trackdechetsIdentity", "trackdechetsIdentity") // This is the UserIdentity entity
->leftJoin("$alias.fibsd", "fibsd") // Solving another N+1 problem, this time it's a direct one-to-one relation
->orderBy("$alias.id", 'DESC')
;

return $qb->getQuery()->getResult();
Dies generiert ungefähr so ​​viele Abfragen, wie es Benutzer in meiner Datenbank gibt.
Weiß jemand, wie man das löst?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post