标记关系?

Flag a relationship?

我有 posts 和用户模型。用户可以为 post 添加书签。我将这些书签存储在一个枢轴 table 中,上面有 user_idpost_id

我需要取出所有 post 并标记当前登录用户是否已将 post 添加为书签(向图标添加 class)。

return Post::with('bookmarks')->get();

上面获取了 post 的所有书签,我如何标记它以便我知道登录用户是否已将特定 post 添加为书签?

您可以使用 contains() 方法检查给定的用户是否已加入书签 post:

auth()->user()->posts->contains($postId)

Another way 这样做就是使用 whereHas():

$isBookmarked = Post::where('id', $postId)
    ->whereHas('users', function($q) {
        $q->where('id', auth()->id());
    })->count();

更新

您说过要预加载所有 post(对于所有用户)。我刚刚测试了这个解决方案,它不会进行任何额外的查询。

首先,根据需要加载所有数据:

$posts = Post::with('users')->get();

然后你可以检查任何 post 和任何用户之间的关系是否存在而无需执行任何额外的查询:

$isBookmarked = $posts->firstWhere('id', $postId)->users->contains($userId);

您可以遍历帖子集合并添加新属性

return Post::with('bookmarks')->get()->each(function (Post $post) {
    $post->bookmarked = $post->bookmarks->filter(function (Bookmark $bookmark) {
        return $bookmark->user_id === Auth::id();
    })->count() > 0;
})

然后你可以检查 $post->bookmarked - 它是布尔值。

您应该在 ->each(...) 方法之前检查用户是否已登录 - 如果没有,您不应该迭代帖子集合。