Mysql
 sql >> Datenbank >  >> RDS >> Mysql

So verwenden Sie einen Data Mapper mit SQL-Abfragen

Es gibt viele Möglichkeiten, sich dem zu nähern, dies ist eine davon. Nehmen wir an, Sie haben ein ähnliches DB-Schema:

Jetzt können Sie AlbumMapper und ArtistMapper dafür verantwortlich machen, diese Objekte aus der Datenbank für Sie zu holen:

interface AlbumMapper {

    /**
     * Fetches the albums from the db based on criteria
     * @param type $albumCriteria
     * @param ArtistMapper $artistMapper
     * 
     * Note: the ArtistMapper here can be also made optional depends on your app
     */
    public function fetchBySomeCriteria($albumCriteria, ArtistMapper $artistMapper);
}

interface ArtistMapper {

    /**
     * @param array $ids
     * @return Artist[]
     */
    public function fetchByAlbumIds(array $ids);
}

Ich habe gesagt, dass AlbumMapper ArtistMapper benötigt, also werden mit diesem Mapper Alben immer mit ihren Künstlern zurückgegeben. Nun könnte eine Beispielimplementierung wie folgt aussehen, bei der ich einen kleinen Indizierungstrick verwende, um Künstler an Alben anzuhängen:

class ConcreteAlbumMapper implements AlbumMapper {

    public function fetchBySomeCriteria($albumCriteria, ArtistMapper $artistMapper) {
        //sql for fetching rows from album table based on album criteria

        $albums = array();

        foreach ($albumRows as $albumRow) {
            $albums[$albumRow['id']] = new Album($albumRow);
        }

        $artists = $artistMapper->fetchByAlbumIds(array_keys($albums));

        //marrying album and artists
        foreach ($artists as $artist) {
            /**
             * not crazy about the getAlbumId() part, would be better to say
             * $artist->attachYourselfToAnAlbumFromThisIndexedCollection($albums);
             * but going with this for simplicity
             */
            $albums[$artist->getAlbumId()]->addArtist($artist);
        }

        return $albums;
    }

}

In diesem Fall sieht Ihr Album wie folgt aus:

class Album {

    private $id;
    private $title;
    private $artists = array();

    public function __construct($data) {
        //initialize fields
    }

    public function addArtist(Artist $artist) {
        $this->artists[] = $artist;
    }

}

Am Ende sollten Sie eine Sammlung von Album-Objekten haben, die mit ihren Künstlern initialisiert sind.