0
사용자가 서로 메시지를 남길 수있는 사용자 프로필이 있습니다. Laravel의 쓰레드 설명/Eloquent
는id
,
user_id
는
author_id
는,
parent_id
, 그리고
message
가, 어떻게 효율적으로 스레드 레이아웃을 표시 할 다음과 같은 필드와
profile_messages
테이블을 감안할 때 (페이스 북/마이 스페이스 생각)?
참고 : 댓글의 깊이는 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
구조와 일치하는 결과 세트를 얻는 방법이 있을까?
감사합니다, 나는 그 라인을 따라 뭔가를 생각하지만 난 일을하지 않은 것을 알고 있도록 한 문제로 실행 상태로 유지 권리. 나는 이것을 가지고 가서 그것이 내가 원하는 것을 볼 것입니다. :) – user1960364
N + 1로 구출하기 위해 열심 인. 그리고 네, 이것은 당신이 찾고있는 것입니다 : –
흠, 나는 그들을로드하려고하는 것과 상관없이 n + 1 문제에 아직도 달려 있습니다 ... 나는 당신의 코드를 기반으로 한 변경 사항을 게시했습니다 여기 : http://laravel.io/bin/xK0WB – user1960364