2017-03-21 3 views
-1

私はアーティストのデータベースを構築しています。オブジェクト指向の方法でアーティストが演奏するジャンルを更新/作成したいと思います。クラシック、ヒップホップ、ジャズやその他:私はアーティストが実行できる4つの可能なジャンルで構成されていたジャンルのテーブルを作成したアーティストオブジェクト指向の方法で1対多のリレーションシップを処理する方法は?

enter image description here

テーブル名:私は現在、3つのテーブルを持っています。

テーブル名:ジャンル

enter image description here

各アーティストがジャンルと1対多の関係を持っています

テーブル名:artist_genres

enter image description here

私がしたいことは、出力に次の形式で、アーティストが演じるのジャンルです:私のようなアーティストクラスの機能を持っていると思いますため、 $artist->genres意志出力あらゆるジャンル:上記

public static function find_genres_by_id($id=0){ 
    } 

のみ提供します私がジャンルテーブルで調べる必要のある私のID。問題は、上記は配列ではなく、私はそれを直接使うことができないということです。しかし、私は私がやりたいことには、次のコードを思い付いた:

global $database; 
$sql = "SELECT genre_id FROM artists JOIN artist_genres ON artists.id=artist_genres.artist_id WHERE artist_id=8"; 
$answer = $database->query($sql); 
while ($row = $answer->fetch_assoc()) { 
$genresql = "SELECT genre_name FROM genres WHERE id=".$row['genre_id']; 
$genrelist = $database->query($genresql); 
while ($genrerow = $genrelist->fetch_assoc()){ 
    echo $genrerow['genre_name']."<br>"; 
} 

これは単純にジャンルを出力しますが、私は出力にジャンルをecho $artist->genres簡素をインスタンス化して使用することができることができるようにしたいです。私は現在、$artist=Artist::find_by_id($id)







EXTRA使用した後$artist->id$artist->first_nameなどのためにこれを行うことができます(I HAVE以下の機能):

class DatabaseObject { 

    public static function find_available_artists() { 
    return static::find_by_sql("SELECT * FROM artists WHERE availability=1"); 
    } 
    public static function find_genres_by_id($id=0){ 
    return static::find_by_sql("SELECT genre_id FROM allartists JOIN artist_genres ON allartists.id=artist_genres.artist_id WHERE artist_id={$id}"); 
    } 

    public static function find_all() { 
    return static::find_by_sql("SELECT * FROM ".static::$table_name); 
    } 

    public static function find_by_id($id=0) { 
    $result_array = static::find_by_sql("SELECT * FROM ".static::$table_name." WHERE id={$id} LIMIT 1"); 
    return !empty($result_array) ? array_shift($result_array) : false; 
    } 
    public static function find_by_sql($sql=""){ 

    global $database; 
    $result_set = $database->query($sql); 
    $object_array = array(); 
    while ($row = $database->fetch_array($result_set)) { 
     $object_array[]=static::instantiate($row); 
    } 
    return $object_array; 
    } 


    private static function instantiate($record){ 
    $class_name = get_called_class(); 
    $object = new $class_name; 

    foreach($record as $attribute=>$value) { 
    if($object->has_attribute($attribute)) { 
     $object->$attribute = $value; 
    } 

    } 
    return $object; 
    } 
    private function has_attribute($attribute) { 
    $object_vars = get_object_vars($this); 
    return array_key_exists($attribute, $object_vars); 

    } 
+0

私の解決策は、2つの結合を使用することです。さて、あなたの中に、ユーザーのIDの入力変数を持つアーティストオブジェクトのメソッドがあります。そのため、artist_genreにジャンプするJoinとgenre_idでジャンルにジャンプする2番目のjoinがあります。また、2番目のJoinは、1つのアーティストから数多くのジャンルの例を正確に持っているため、より多くの行をリストするためにRight Joinになります。 –

+0

このようなダブルジョインステートメントの例を教えてください。 – GRS

+0

SELECT artists.first_name、artists.last_name、genres.id FROMアーティストJOIN artist_genres ON artists.id = artist_genres.id RIGHT JOINジャンルON artist_genres.id = id.genres –

答えて

1

アーティストエンティティクラスに追加できる「ジャンル」フィールド、配列がありますか?

<?php 

class Artist 
{ 
    private $genres; 

    public function addToGenres($genre) 
    { 
     $this->genres[] = $genre; 
    } 
} 
関連する問題