Допустим, я создаю ленту комментариев и мне нужны данные комментариев и пользовательские данные автора. Комментарии представлены классом Comment
. Пользователи представлены классом User
. При получении комментариев, $author
член 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
... метод Comment 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']
));
}
Так вот мой вопрос:
Я что-то упустил? Должен быть лучший способ сделать это. Этот способ кажется негибким и склонным к разрыву при изменении таблиц или метода User
, и в результате возникает необходимость в поле, которое не предусмотрено запросом. Отдельный запрос для каждого пользователя не может быть опцией ... не так ли?
(ps имейте в виду, что объект User немного более сложен, чем этот, и у него гораздо больше методов, которые вызываются позже при отображении комментариев. Его нельзя разумно сгладить и рассматривать как массив. Настройка OO довольно необходима.)