sql >> Databáze >  >> RDS >> Mysql

Jak používat mapovač dat s dotazy SQL

Existuje mnoho způsobů, jak k tomu přistupovat, toto je jeden z nich. Řekněme, že máte schéma db podobné tomuto:

Nyní můžete mít AlbumMapper a ArtistMapper odpovědné za načítání těchto objektů z databáze:

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

Vložil jsem, že AlbumMapper vyžaduje ArtistMapper, takže s tímto mapovačem jsou alba vždy vrácena se svými umělci. Nyní může být příklad implementace takový, kde používám malý trik s indexováním k připojení interpreta k albům:

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

}

V tomto případě bude vaše album vypadat takto:

class Album {

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

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

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

}

Na konci toho všeho byste měli mít kolekci objektů alba inicializovanou s jejich umělci.




  1. Existuje nástroj pro generování úplné databáze DDL pro SQL Server? A co Postgres a MySQL?

  2. Vypsat všechny tabulky ve formátu CSV pomocí 'mysqldump'

  3. PDOStament - Použít ve sloupcích vážné akcenty (`)?

  4. Oprava děr/mezer v číslech generovaných sekvencí Postgres