2014-11-19 3 views
0

사용자가 서로 메시지를 남길 수있는 사용자 프로필이 있습니다. Laravel의 쓰레드 설명/Eloquent

id, user_idauthor_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 구조와 일치하는 결과 세트를 얻는 방법이 있을까?

답변

1

설명에서 사용자에게 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'); 
} 
+0

감사합니다, 나는 그 라인을 따라 뭔가를 생각하지만 난 일을하지 않은 것을 알고 있도록 한 문제로 실행 상태로 유지 권리. 나는 이것을 가지고 가서 그것이 내가 원하는 것을 볼 것입니다. :) – user1960364

+0

N + 1로 구출하기 위해 열심 인. 그리고 네, 이것은 당신이 찾고있는 것입니다 : –

+0

흠, 나는 그들을로드하려고하는 것과 상관없이 n + 1 문제에 아직도 달려 있습니다 ... 나는 당신의 코드를 기반으로 한 변경 사항을 게시했습니다 여기 : http://laravel.io/bin/xK0WB – user1960364