【问题标题】:Load all posts and check if the post is liked or not in laravel加载所有帖子并检查帖子是否在 laravel 中被喜欢
【发布时间】:2016-01-16 23:31:25
【问题描述】:

我有一个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();

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

【问题讨论】:

    标签: php laravel laravel-5 eloquent laravel-5.1


    【解决方案1】:

    首先,我会稍微修改一下您的初始查询。我会像这样得到用户喜欢的帖子(假设Postlikes 关系):

    $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) 的点赞帖子时,您可以使用 Collection contains() 方法来检查帖子是否也被登录用户点赞:

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

    【讨论】:

    • $user->posts() 这只会收集用户创建的帖子。对?我想在所有帖子中检查它。
    • @user1012181 是的,没错。重新阅读您的问题,这是有道理的。因此,您只需将$user->posts()-> 更改为Post::。 ($authUser->posts()-> 也一样)
    • 谢谢。它有帮助。但是$authLikedPosts->has($post->id) 应该是$authLikedPosts->contains('id', $post->id)
    • @user1012181 是的,你是对的。虽然我认为 Eloquent Collections 是由模型 ID 自动键入的,但事实并非如此。在这种情况下,是的,contains() 是正确的使用方法。对于 Eloquent Collections,如果你只传入值,它会自动查找模型上的 key 字段并进行比较,但如果你调用将 Eloquent Collection 转换为 Base 的方法,指定字段可能更安全收藏。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-07
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多