标记关系?
Flag a relationship?
我有 posts 和用户模型。用户可以为 post 添加书签。我将这些书签存储在一个枢轴 table 中,上面有 user_id
和 post_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(...)
方法之前检查用户是否已登录 - 如果没有,您不应该迭代帖子集合。
我有 posts 和用户模型。用户可以为 post 添加书签。我将这些书签存储在一个枢轴 table 中,上面有 user_id
和 post_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(...)
方法之前检查用户是否已登录 - 如果没有,您不应该迭代帖子集合。