Это очень запутанно; похоже, мне нужно иметь по крайней мере одно отношение «многие ко многим».
Может ли кто-нибудь помочь мне в разработке класса или классов для этого?
Попробуйте что-нибудь подобное
tblSongs SongId заглавие YearProduced и т.п. tblArtist ArtistId имя Страница профиля и т.д.. tblSongArtists SongId ArtistId
Тогда ваши запросы могут выглядеть примерно так:
SELECT Title, YearProduced, Name, ProfilePage FROM tblSongs S LEFT OUTER JOIN tblSongArtists SA ON SA.SongId = S.SongId LEFT OUTER JOIN tblArtists A ON A.ArtistId = SA.ArtistId WHERE Title = 'I got the blues' -- .... ORDER BY SongId -- or Song Title (*)
(*) order by, если критерии поиска производят более одной песни, и если вы хотите последовательно удерживать художников за данную песню.
Такой запрос создает несколько строк для песни с несколькими художниками, по одной строке для каждого исполнителя, значения столбцов от повторяющихся tblSongs.
Для любых отношений «многие ко многим» требуются три таблицы. Для вашего примера:
Song<br/> Name SongID Artist <br/> Name ArtistID ArtistsInSongs <br/> ArtistID SongID
Я дам вам понять остальное.
public static function find_artist_on($track_id=0) { global $database; $sql = "SELECT * FROM " . self::$table_name ." s " ; $sql .= "LEFT OUTER JOIN trackartist TA ON TA.track_id =s.track_id"; $sql .= "LEFT OUTER JOIN artist A ON A.artist_id =TA.artist_id"; $sql .= " WHERE s.artist_id=" .$database->escape_value($track_id); $sql .= " ORDER BY artist_id ASC"; return self::find_by_sql($sql); }