Резьбовые комментарии в Laravel w / Eloquent

У меня есть профили пользователей, которые позволяют пользователям оставлять сообщения друг для друга. (Подумайте, Facebook / MySpace) …

Учитывая profile_messages таблица со следующими полями id, user_id, author_id, parent_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 состав?

0

Решение

Из вашего описания я предполагаю, что у вас есть корневые сообщения, которые имеют 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');
}
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]