Главная » PHP » Резьбовые комментарии в Laravel w / Eloquent
Резьбовые комментарии в 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 состав?
Из вашего описания я предполагаю, что у вас есть корневые сообщения, которые имеют 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');
}
У меня есть профили пользователей, которые позволяют пользователям оставлять сообщения друг для друга. (Подумайте, Facebook / MySpace) …
Учитывая
profile_messages
таблица со следующими полямиid
,user_id
,author_id
,parent_id
, а такжеmessage
Как бы я эффективно отобразить их в многопоточном макете?Примечание: комментарии будут только на 1 уровне.
В настоящее время я собираю все соответствующие комментарии, а затем перестраиваю коллекцию, чтобы получить
$messages
с подгруппойreplies
на каждом предмете.Это прекрасно работает. Тем не менее, я не могу не думать, что есть лучший способ сделать это … Есть ли лучший способ сделать это, или, возможно, способ использовать отношения, чтобы получить набор результатов, соответствующий
$profileMessage->replies
состав?Решение
Из вашего описания я предполагаю, что у вас есть корневые сообщения, которые имеют
user_id
указывая на пользователя, сообщение было отправлено. И ответы на те корневые сообщения, которые относятся не кuser_id
но кparent_id
,Так:
с отношениями, как показано ниже:
Другие решения
Других решений пока нет …