Dalam Doktrin2, mengendalikan perhubungan banyak-ke-banyak memerlukan pertimbangan yang teliti, terutamanya apabila lajur tambahan terlibat dalam jadual rujukan. Walaupun pendekatan hubungan satu-ke-banyak yang dicadangkan boleh berkesan, ia memperkenalkan potensi cabaran dalam mengakses data yang diingini.
Pertimbangkan contoh album dan lagu, di mana kami memerlukan hubungan banyak-ke-banyak dengan lajur tambahan, seperti kedudukan lagu dan status dinaikkan pangkat dalam album. Pemetaan kelihatan seperti ini:
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; }
Kaedah Album::getTracklist() mengembalikan tatasusunan objek AlbumTrackReference dan bukannya objek Track, menjadikannya mencabar untuk mengakses maklumat khusus trek. Walaupun pilihan seperti kaedah proksi atau pemprosesan tambahan dalam kaedah itu boleh memberikan penyelesaian, ia boleh menyusahkan dan tidak cekap.
Pendekatan alternatif yang dicadangkan oleh komuniti Doktrin adalah untuk menganggap hubungan banyak-ke-banyak sebagai entiti itu sendiri. Ini membolehkan kami mencipta entiti khusus untuk jadual rujukan, dengan hubungan satu-dengan-banyak dan banyak-dengan-satu antara album dan entiti lagu.
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; }
Pendekatan ini memudahkan pengambilan data dengan menyediakan terus akses kepada maklumat lagu dan album melalui entiti AlbumTrackReference. Kod itu kemudiannya boleh menjadi:
foreach ($album->getTracklist() as $albumTrackReference) { $track = $albumTrackReference->getTrack(); echo sprintf("\t#%d - %-20s (%s) %s\n", $albumTrackReference->getPosition(),
Atas ialah kandungan terperinci Bagaimana Mengendalikan Perhubungan Banyak-ke-Ramai dengan Cekap dengan Lajur Tambahan dalam Doktrin2?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!