Laravel - Limite cada item filho com eficiência
Eu tenho isto:
$commentReplies = Comment::whereIn('comment_parent_id', $CommentsIDs)
->take(2)->get();
Onde$CommentsIDs
é uma matriz de três IDs de comentários principais (1,2,3).
Estou tentando recuperar 2 respostas para cada um dos $ commentsIDs, se eles existirem. Portanto, um total de 6 respostas (2 para cada comentário) deve retornar com a consulta, se as respostas existirem, nada mais. No entanto, com o take (2), ele limita as respostas a 2, e só recebemos 2 respostas para um dos comentários. Como pode ser configurado para obter 2 respostas para cada um dos IDs de comentários da maneira mais eficiente e como eles podem ser renderizados na exibição com o aninhamento correto?
Algo como:
Comment 1
--Comment 1 Reply 1 (load this)
--Comment 1 Reply 2 (load this)
--Comment 1 Reply 3 (don't load this)
--Comment 1 Reply 4 (don't load this)
Comment 2
--Comment 2 Reply 1 (load this)
--Comment 2 Reply 2 (load this)
--Comment 2 Reply 3 (don't load this)
Comment 3
(no replies, don't load anything)
Atualizar:
Aqui está o modelo de comentários:
class Comment extends BaseModel {
public function latestTwoComments()
{
return $this->hasMany('Comment','comment_parent_id')->latest()->nPerGroup('comment_parent_id', 2);
}
}
Inquerir:
$comments = Comment::with('latestTwoComments')->get();
dd(DB::getQueryLog());
// Result:
'query' => string 'select * from (select `comments`.*, @rank := IF(@group = comment_parent_id, @rank+1, 1) as rank_575b053fb57f8fab5bc86dd324b39b91, @group := comment_parent_id as group_575b053fb57f8fab5bc86dd324b39b91 from (SELECT @rank:=0, @group:=0) as vars, comments where `comments`.`deleted_at` is null order by `comment_parent_id` asc, `created_at` desc) as comments where `comments`.`deleted_at` is null and `rank_575b053fb57f8fab5bc86dd324b39b91` <= ? and `comments`.`comment_parent_id` in (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?'... (length=603)