如何获取Laravel Relational Eloquent热切加载的最新5条评论用户信息



我需要在评论列表的顶部显示最后5个唯一的评论信息,如下屏幕截图所示。

评论图像

这样做。我做了以下事情:后模型

public function comments()
{
return $this->hasMany(Comment::class);
}
public function commenter_avatars(){
return $this->comments()->distinct('user_id')
->select('id','post_id','user_id','parent_id')
->whereNull('parent_id')
->with('user')->limit(5);
}

我的控制器方法如下

public function index() {
$feeds = auth()->user()
->posts()
->with(['user:id,first_name,last_name,username,avatar', 'media', 'commenter_avatars'])
->orderBy('id', 'desc')
->paginate(10);
return PostResource::collection($feeds);
}

我尝试使用groupBy和Distinct。。但并没有如预期的那样起作用。

我错过什么了吗?或者有什么更好的方法来解决这个问题吗?

提前谢谢!

注意:我使用的是最新的Laravel(8.48?(

我不知道你加入了post、user和comments表。但我想,你们可以做一些类似下面的事情。

首先获得一个帖子的最新5个唯一用户id:

$userIds = Comments::where("post_id", $post_id)->distinct("user_id")->orderBy("id")
->limit(5)->pluck('user_id');

然后,提取那些用户信息

$users = Users::whereIn("id", $userIds )->get();

然后,你可以返回那些用户

更新

您可以使用map()来获取和重新排序输出。以下是您的想法:

控制器内:

public function index(Request $request) {
$skipNumber = $request->input("skip"); // this is need for offsetting purpose
$userIds = [];
$feeds = Posts::with("comments")->where("comments.user_id", Auth::id())
->skip($skipNumber)->take(10)->orderBy('comments.id', 'desc')
->map(function ($item) use($userIds){
$users = [];
$count = 0;
foreach($item["comments"] as $comment) {
if(!in_array($comment["user_id"], $userIds) && $count < 5){
$count++;
$userIds.push($comment["user_id"])
$user = User::where("id", $comment["user_id"])->first();
$users.push($user);
}
if($count == 5) break;
}
$data = [
"post" => $item,
"latest_users" => $users
];
return $data;

})->get();
return PostResource::collection($feeds);

}

我的代码语法可能有点错误。希望你能明白。

我已经通过使用雄辩的热切极限解决了这个问题

https://github.com/staudenmeir/eloquent-eager-limit

最新更新