Doctrine2에서 다대다 관계를 처리하려면 특히 추가 열이 있는 경우 신중한 고려가 필요합니다. 참조 테이블에 포함됩니다. 제안된 이중 일대다 관계 접근 방식은 효과적일 수 있지만 원하는 데이터에 액세스하는 데 잠재적인 문제가 발생할 수 있습니다.
앨범과 앨범의 예를 생각해 보세요. 트랙의 경우 트랙 위치, 앨범 내 프로모션 상태 등 추가 열과의 다대다 관계가 필요합니다. 매핑은 다음과 같습니다.
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; }
Album::getTracklist() 메서드는 Track 객체 대신 AlbumTrackReference 객체의 배열을 반환합니다. 트랙별 정보에 액세스하기가 어렵습니다. 프록시 방법이나 메서드의 추가 처리와 같은 옵션이 솔루션을 제공할 수 있지만 번거롭고 비효율적일 수 있습니다.
에서 제안하는 대체 접근 방식 교리 공동체는 다대다 관계를 그 자체로 하나의 실체로 간주합니다. 이를 통해 앨범과 트랙 엔터티 간의 일대다 및 다대일 관계를 통해 참조 테이블에 대한 전용 엔터티를 생성할 수 있습니다.
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; }
이 접근 방식은 직접 제공하여 데이터 검색을 단순화합니다. AlbumTrackReference 엔터티를 통해 트랙 및 앨범 정보에 모두 액세스합니다. 그러면 코드는 다음과 같습니다.
foreach ($album->getTracklist() as $albumTrackReference) { $track = $albumTrackReference->getTrack(); echo sprintf("\t#%d - %-20s (%s) %s\n", $albumTrackReference->getPosition(),
위 내용은 Doctrine2의 추가 열을 사용하여 다대다 관계를 효율적으로 처리하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!