0

我有用户个人资料,允许用户互相留言。(想想 Facebook/MySpace)...

给定一个profile_messages包含以下字段iduser_idauthor_idparent_id和的表格message,我将如何在线程布局中有效地显示它们?

注意:评论的深度只有 1 级。

目前,我正在获取所有相关评论,然后重建集合以在每个项目上都有$messages一个子集合。replies

$messages = new Collection();
$replySets = [];

foreach ($user->profileMessages as $message)
{
    $parentId = $message->parent_id;

    if ($parentId == 0)
    {
        $messages->put($message->id, $message);
    }
    else
    {
        $replySets[$parentId][] = $message;
    }
}

foreach ($replySets as $parentId => $replies)
{
    $parent = $messages->get($parentId);

    if (isset($parent))
    {
        if ( ! isset($parent->replies))
        {
            $parent->replies = new Collection();
        }

        foreach ($replies as $reply)
        {
            $parent->replies->push($reply);
        }
    }
}

// Pass $messages to the view


这很好用。但是,我不禁想到有更好的方法来做到这一点......有没有更好的方法来做到这一点,或者也许有一种方法可以利用关系来获得与$profileMessage->replies结构匹配的结果集?

4

1 回答 1

3

根据您的描述,我假设您有user_id指向用户的根消息,一条消息已发送到。并回复那些与 . 无关user_id但与. 相关的根消息parent_id

所以:

$user->load('messages.replies.author');

foreach ($user->messages as $message)
{
  $message; // root message
  $message->replies; // collection
  $message->replies->first(); // single reply
  $message->replies->first()->author;
}

关系如下:

// user model
public function messages()
{
  return $this->hasMany('Message')->where('parent_id', '=', 0);
  // you could also create RootMessage model with global scope instead of this where
}

// message model
public function replies()
{
  return $this->hasMany('Message', 'parent_id');
  // again, here you can create separate Reply model if you like
}

public function author()
{
  return $this->belongsTo('User', 'author_id');
}

public function user()
{
  return $this->belongsTo('User');
}
于 2014-11-19T20:20:01.977 回答