ホームページ >バックエンド開発 >PHPチュートリアル >Doctrine2 で追加の列を使用して多対多の関係を効率的に処理するにはどうすればよいですか?
Doctrine2 では、特に追加の列が存在する場合、多対多の関係を処理するには慎重な考慮が必要です。参照テーブルに関係します。提案されている二重 1 対多リレーションのアプローチは効果的ですが、目的のデータにアクセスする際に潜在的な課題が生じます。
アルバムとトラックの例を考えてみましょう。トラックでは、アルバム内でのトラックの位置やプロモートされたステータスなど、追加の列との多対多の関係が必要です。マッピングは次のようになります。
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 オブジェクトの配列を返します。そのため、トラック固有の情報にアクセスすることが困難になります。プロキシ メソッドやメソッド内の追加処理などのオプションは解決策を提供しますが、煩雑で非効率的になる可能性があります。
によって提案される代替アプローチDoctrine コミュニティでは、多対多の関係をそれ自体が 1 つのエンティティとして考慮する必要があります。これにより、アルバム エンティティとトラック エンティティの間に 1 対多および多対 1 の関係を持つ参照テーブル専用のエンティティを作成できます。
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 中国語 Web サイトの他の関連記事を参照してください。