使用Laravel过滤

时间:2017-02-18 13:16:31

标签: php json laravel laravel-collection

在我的Laravel项目中,我遇到以下问题。 (为了便于阅读,我减少了输出量)

  1. 我从名为Newsposts的表中获取所有帖子。我将它存储为名为$ all_posts的集合,如下所示:
  2. Collection {#216 ▼
      #items: array:7 [▼
        0 => NewsPost {#227 ▶}
        1 => NewsPost {#228 ▶}
        2 => NewsPost {#229 ▼
          #attributes: array:6 [▼
            "id" => 6
            "title" => "Sample title"
            "body" => "<p>Some html</p>"
            "user_id" => 15
          ]
          #original: array:6 [▶]
          #casts: []
          .
          .
          #guarded: array:1 [▶]
        }
        3 => NewsPost {#230 ▶}
        4 => NewsPost {#231 ▶}
      ]
    }
    
    1. 然后我从另一个名为user_read的表中获取所有条目,其中包含当前用户已阅读的所有帖子。此表包含对具有&#39; user_id&#39; -column的用户的引用,以及对具有&post -id&quot;列的&#39; post_id&#39; -column的新闻帖的引用。我还将它存储在一个集合中,如下所示:
    2. Collection {#219 ▼
        #items: array:2 [▼
          0 => UserRead {#210 ▼
            #attributes: array:4 [▼
              "user_id" => 15
              "post_id" => 6
            ]
            #original: array:4 [▶]
            #casts: []
            .
            .
            #guarded: array:1 [▶]
          }
          1 => UserRead {#217 ▶}
        ]
      }
      
      1. 所以我现在要做的是获取$ all_posts-collection并删除$ read_posts-collection中的所有帖子,并将其存储在新的集合中。让我们称之为$ unread_posts。我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:1)

首先获取所有readed post id,然后使用过滤功能过滤未读帖子

$readedPosts = $user_read->pluck('post_id');
$unread_posts = $all_posts->filter(function($value) use ($readedPosts) {
      return !in_array($value->id, $readedPosts);  
})