如何以面向对象的方式处理一对多关系?

时间:2017-03-21 22:44:30

标签: php mysql

我正在建立一个艺术家数据库,我想以面向对象的方式更新/创建艺术家所播放的流派。我目前有3张桌子:

表名:艺术家

enter image description here

我创建了一个类型表,其中包括艺术家可以执行的4种可能的类型:古典,嘻哈,爵士和其他。

表名:流派

enter image description here

每位艺术家都与流派有一对多的关系:

表名: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->id

后为$artist->first_name$artist=Artist::find_by_id($id)等执行此操作

额外(我有以下功能):

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

   }

1 个答案:

答案 0 :(得分:1)

您的艺术家实体类是否有“genres”字段,数组,您可以添加到哪个?

<?php

class Artist 
{
    private $genres;

    public function addToGenres($genre)
    {
        $this->genres[] = $genre;
    }
}