检查集合是否包含值

时间:2017-01-19 15:57:52

标签: php laravel model eloquent foreign-keys

我建立了关系(我认为正确)..我有3个表,用户,评论和评论'喜欢表。

在我的刀片中,我可以使用此访问{{ $comment->commentLikes }}并且它正在返回我:

[{"id":85,"comment_id":12,"user_id":1,"action":1},
{"id":86,"comment_id":12,"user_id":3,"action":1},
{"id":87,"comment_id":12,"user_id":4,"action":1},
{"id":88,"comment_id":12,"user_id":6,"action":1},
{"id":89,"comment_id":12,"user_id":9,"action":1}]

user_id代表所有者。

现在我想检查这个集合是否有经过身份验证的用户,换句话说,如果当前用户喜欢这个评论。有没有办法做到这一点而不是使用for循环?也许类似于{{ $comment->commentLikes->owner }},以便我可以使用

'if(this)包含Auth::user->id()'...

4 个答案:

答案 0 :(得分:0)

检查此方法的一种方法是使用where()first()收集方法:

if ($comment->commentLikes->where('user_id', auth()->user()->id)->first())

答案 1 :(得分:0)

// This works if $comment->commentLikes returns a collection
$userLikes = $comment->commentLikes->where('user_id', Auth::user()->id)->all();

if ($userLikes->count() > 0) {
    // Do stuff
}

答案 2 :(得分:0)

选项1

使用Laravel collection你可以这样做:

$comment->commentLikes->search(function ($item, $key) {
    return $item->user_id == auth()->user()->id;
});

如果没有找到,则返回false,如果用户在集合中,则返回索引。

做得很漂亮

但是既然你可能会在视图中使用它,我会将其打包成accessor,如下所示:

class Comment extends Model
{
    public function commentLikes() {
        // relationship defined
    }

    public function getHasLikedAttribute()
    {
        // use getRelationValue so it won't load again if it was loaded before
        $comments = $this->getRelationValue('commentLikes');

        $isOwner = $comment->commentLikes->search(function ($item, $key) {
            return $item->user_id == auth()->user()->id;
        });

        return $isOwner === false ? false : true;
    }
}

通过这种方式,您可以调用$comment->has_liked,如果当前登录的用户位于关系truecommentLikes,则会返回false

答案 3 :(得分:0)

使用:

if ($comment->commentLikes()->where('user_id', auth()->user()->id)->count() > 0)

这比发布的其他答案更高效因为where()和count()都适用于查询构建器对象而不是集合