sql >> Databasteknik >  >> RDS >> Mysql

Hur man använder en datamapper med sql-frågor

Det finns många sätt att närma sig detta, det här är ett av dem. Låt oss säga att du har ett db-schema som liknar detta:

Nu kan du ha AlbumMapper och ArtistMapper ansvariga för att hämta dessa objekt från db åt dig:

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);
}

Jag har sagt att AlbumMapper kräver ArtistMapper så med denna mappar returneras album alltid med sina artister. Nu kan ett exempelimplementering vara så här där jag använder ett litet indexeringstrick för att bifoga artist till album:

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;
    }

}

I det här fallet kommer ditt album att vara i stil med:

class Album {

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

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

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

}

I slutet av allt detta bör du ha en samling albumobjekt initialiserade med deras artister.




  1. Hur fungerar alter table switch på sql server?

  2. läser BLOB-bild från MySQL-databas

  3. Installera Oracle-klient i docker-container

  4. Uppdatera Woocommerce-ordrar programmatiskt