In Doctrine2 erfordert die Handhabung von Viele-zu-viele-Beziehungen sorgfältige Überlegungen, insbesondere wenn zusätzliche Spalten vorhanden sind in die Referenztabelle einbezogen. Während der vorgeschlagene Ansatz der doppelten Eins-zu-Viele-Beziehung effektiv sein kann, bringt er potenzielle Herausforderungen beim Zugriff auf die gewünschten Daten mit sich.
Betrachten Sie das Beispiel von Alben und Titel, bei denen wir eine Viele-zu-Viele-Beziehung mit zusätzlichen Spalten benötigen, wie z. B. die Position des Titels und den Promo-Status im Album. Die Zuordnung sieht in etwa so aus:
class Album { /** @OneToMany(targetEntity="AlbumTrackReference", mappedBy="album") */ protected $tracklist; } class Track { /** @OneToMany(targetEntity="AlbumTrackReference", mappedBy="track") */ protected $albumsFeaturingThisTrack; } class AlbumTrackReference { /** @ManyToOne(targetEntity="Album", inversedBy="tracklist") */ protected $album; /** @ManyToOne(targetEntity="Track", inversedBy="albumsFeaturingThisTrack") */ protected $track; /** @Column(type="integer") */ protected $position; /** @Column(type="boolean") */ protected $isPromoted; }
Die Methode Album::getTracklist() gibt ein Array von AlbumTrackReference-Objekten anstelle von Track-Objekten zurück. Dies erschwert den Zugriff auf streckenspezifische Informationen. Obwohl Optionen wie Proxy-Methoden oder zusätzliche Verarbeitung in der Methode eine Lösung bieten können, können sie umständlich und ineffizient sein.
Der alternative Ansatz, der von vorgeschlagen wird Die Doktrin-Gemeinschaft soll die Viele-zu-Viele-Beziehung als eine eigenständige Einheit betrachten. Dadurch können wir eine dedizierte Entität für die Referenztabelle erstellen, mit Eins-zu-Viele- und Viele-zu-Eins-Beziehungen zwischen den Album- und Titelentitäten.
class AlbumTrackReference { /** @Id @Column(type="integer") */ protected $id; /** @ManyToOne(targetEntity="Album") */ protected $album; /** @ManyToOne(targetEntity="Track") */ protected $track; /** @Column(type="integer") */ protected $position; /** @Column(type="boolean") */ protected $isPromoted; }
Dieser Ansatz vereinfacht den Datenabruf durch direkte Bereitstellung Zugriff auf Titel- und Albuminformationen über die AlbumTrackReference-Entität. Der Code kann dann wie folgt lauten:
foreach ($album->getTracklist() as $albumTrackReference) { $track = $albumTrackReference->getTrack(); echo sprintf("\t#%d - %-20s (%s) %s\n", $albumTrackReference->getPosition(),
Das obige ist der detaillierte Inhalt vonWie kann man Many-to-Many-Beziehungen mit zusätzlichen Spalten in Doctrine2 effizient handhaben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!