假设我正在构建评论摘要,需要作者的评论数据和用户数据。注释由Comment
类表示。用户由User
类表示。在提取评论时,$author
的{{1}}成员应设置为Comment
的实例(以保留有关作者的所有信息)。
User
到目前为止,我一直在做的方法是加入表格,只提取我需要的基本用户数据......如果任何列名称冲突,我设置一个别名(class Comment {
var $id;
var $body;
var $timestamp;
var $etc;
var $authorid;
var $author; //(a 'user' instance)
static function fromArray($members){ /*...*/ }
}
class User {
var $id;
var $username;
var $haspicture;
var $etc;
static function fromArray($members){ /*...*/ }
}
)。这是基本的外观:
field AS somethingelse
要创建$query = mysql_query('SELECT c.*, u.username AS author_username, u.haspicture AS author_haspicture FROM comments c JOIN user u ON u.id = c.authorid');
while ($row = mysql_fetch_array($query, MYSQL_ASSOC)){
$comment = Comment::fromArray($row);
}
...每行提供的评论$author
方法如下所示:
fromArray()
我错过了什么吗?必须有一个更好的方法来做到这一点。这种方式似乎非常不灵活,并且当表更改或static function fromArray($members){
foreach($members as $field => $value){
$this->$field = $value;
}
$this->author = User::fromArray(array(
'id' => $row['authorid'],
'username' => $row['author_username'],
'haspicture' => $row['author_haspicture']
));
}
方法更改并最终需要查询未提供的字段时,容易破坏。每个用户的单独查询都不是一个选项......可以吗?
(ps请记住,User对象比这更复杂,并且它有更多的方法,这些方法稍后在显示注释时调用。它不能被合理地展平并被视为数组。 OO设置非常必要。)