Doctrine2: Best way to handle many-to-many with extra columns in reference table

后端 未结 14 2199
灰色年华
灰色年华 2020-11-22 10:44

I\'m wondering what\'s the best, the cleanest and the most simply way to work with many-to-many relations in Doctrine2.

Let\'s assume that we\'ve got an album like

14条回答
  •  Happy的楠姐
    2020-11-22 11:30

    I think I would go with @beberlei's suggestion of using proxy methods. What you can do to make this process simpler is to define two interfaces:

    interface AlbumInterface {
        public function getAlbumTitle();
        public function getTracklist();
    }
    
    interface TrackInterface {
        public function getTrackTitle();
        public function getTrackDuration();
    }
    

    Then, both your Album and your Track can implement them, while the AlbumTrackReference can still implement both, as following:

    class Album implements AlbumInterface {
        // implementation
    }
    
    class Track implements TrackInterface {
        // implementation
    }
    
    /** @Entity whatever */
    class AlbumTrackReference implements AlbumInterface, TrackInterface
    {
        public function getTrackTitle()
        {
            return $this->track->getTrackTitle();
        }
    
        public function getTrackDuration()
        {
            return $this->track->getTrackDuration();
        }
    
        public function getAlbumTitle()
        {
            return $this->album->getAlbumTitle();
        }
    
        public function getTrackList()
        {
            return $this->album->getTrackList();
        }
    }
    

    This way, by removing your logic that is directly referencing a Track or an Album, and just replacing it so that it uses a TrackInterface or AlbumInterface, you get to use your AlbumTrackReference in any possible case. What you will need is to differentiate the methods between the interfaces a bit.

    This won't differentiate the DQL nor the Repository logic, but your services will just ignore the fact that you're passing an Album or an AlbumTrackReference, or a Track or an AlbumTrackReference because you've hidden everything behind an interface :)

    Hope this helps!

提交回复
热议问题