我正在建立一个艺术家数据库,我想以面向对象的方式更新/创建艺术家所播放的流派。我目前有3张桌子:
表名:艺术家
我创建了一个类型表,其中包括艺术家可以执行的4种可能的类型:古典,嘻哈,爵士和其他。
表名:流派
每位艺术家都与流派有一对多的关系:
表名:artist_genres
我想要的是以下列形式输出艺术家所播放的流派:
$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);
}
答案 0 :(得分:1)
您的艺术家实体类是否有“genres”字段,数组,您可以添加到哪个?
<?php
class Artist
{
private $genres;
public function addToGenres($genre)
{
$this->genres[] = $genre;
}
}