Присоединитесь к пользовательской таблице с сообщениями и создайте экземпляр для каждого - PullRequest
0 голосов
/ 01 ноября 2009

Допустим, я создаю ленту комментариев и мне нужны данные комментариев и пользовательские данные автора. Комментарии представлены классом 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 довольно необходима.)

1 Ответ

1 голос
/ 01 ноября 2009

Если бы я был вами, я бы взглянул на некоторые из ORM инструментов, которые есть вокруг, есть хороший список доступных для php:

Хорошая PHP ORM библиотека?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...