代码之家  ›  专栏  ›  技术社区  ›  panthro

标记关系?

  •  0
  • panthro  · 技术社区  · 7 年前

    我有帖子和用户模型。用户可以为帖子添加书签。我将这些书签存储在数据透视表中 user_id post_id 在上面。

    如果当前登录的用户已将帖子添加到书签中(将类添加到图标中),我需要将所有帖子取出并标记。

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

    上面是一篇文章的所有书签,我如何标记它,以便我知道登录的用户是否为某篇文章添加了书签?

    2 回复  |  直到 7 年前
        1
  •  1
  •   Alexey Mezenin    7 年前

    您可以使用 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);
    
        2
  •  0
  •   ventaquil    7 年前

    您可以通过posts集合迭代并添加新属性

    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集合。