加载所有帖子并检查该帖子是否在 laravel 中被喜欢


Load all posts and check if the post is liked or not in laravel

我有一个Post模型和一个Like模型。

当我访问用户页面时,我可以看到他喜欢的所有帖子。现在,我想指示一个小图标,如果正在访问用户页面的登录用户已经喜欢帖子。

这是我选择用户(不是登录用户而是个人资料所有者)喜欢的帖子的方式:

$likesPost = Post::with('user')->join('likes', function ($join) use ($user) {
    $join->on('likes.likeable_id', '=', 'id')->where('likes.user_id', '=', $user->id)->where('likes.likeable_type','=', Post::class);
})->get();

现在我还想检查经过身份验证的用户是否已经喜欢这篇文章以及这个查询。我已经尝试了很多事情,但我不确定我应该如何处理这个问题。我正在使用多态关系。

首先,我会稍微改变一下你的初始查询。我会得到用户喜欢的帖子,如下所示(假设Post具有likes关系):

$profileLikedPosts = Post::whereHas('likes', function($query) use ($user) {
        return $query->where('user_id', $user->id);
    })
    ->get();

接下来,您可以像这样获取当前登录用户的喜欢帖子:

// The "whereIn" just limits the results to those posts already retrieved
// for the profile user. Not required, but gives a little performance boost
// if this collection doesn't need the non-profile-liked posts.
$authUser = Auth::user();
$authLikedPosts = Post::whereHas('likes', function($query) use ($authUser) {
        return $query->where('user_id', $authUser->id);
    })
    ->whereIn('id', $profileLikedPosts->lists('id'))
    ->get();

现在,在边栏选项卡模板中,循环浏览配置文件用户的喜欢帖子 ( $profileLikedPosts ),可以使用集合contains()方法来检查该帖子是否也被登录用户喜欢:

@foreach ($profileLikedPosts as $post)
    // ...
    @if ($authLikedPosts->contains('id', $post->id))
        // this post is liked by both; show your icon
    @endif
    // ...
@endforeach