举一段感情?

时间:2018-01-03 18:24:01

标签: laravel laravel-5 eloquent laravel-eloquent

我有帖子和用户模型。用户可以为帖子添加书签。我将这些书签存储在其中包含user_idpost_id的数据透视表中。

我需要发布所有帖子并标记当前登录用户是否已为帖子添加了书签(将类添加到图标中)。

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

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

2 个答案:

答案 0 :(得分:1)

您可以使用contains()方法检查用户是否为其添加了书签:

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

Another way要做的就是使用whereHas()

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

<强>更新

您已经说过要预加载所有帖子(适用于所有用户)。我刚刚测试了这个解决方案,它不会进行任何其他查询。

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

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

然后,您可以检查任何帖子与任何用户之间的关系是否存在而不执行任何其他查询:

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

答案 1 :(得分:0)

您可以通过帖子集合进行迭代并添加新属性

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(...)方法之前检查用户是否已记录 - 如果不是,则不应该迭代帖子集合。