У меня настроены отношения (думаю, правильно) .. У меня есть 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 }}
так что я могу использовать
‘если (это) содержит Auth::user->id()
»…
Один из способов проверить это с помощью where()
а также first()
методы сбора:
if ($comment->commentLikes->where('user_id', auth()->user()->id)->first())
// This works if $comment->commentLikes returns a collection
$userLikes = $comment->commentLikes->where('user_id', Auth::user()->id)->all();
if ($userLikes->count() > 0) {
// Do stuff
}
Опция 1
С помощью Коллекция Laravel Вы могли бы сделать это:
$comment->commentLikes->search(function ($item, $key) {
return $item->user_id == auth()->user()->id;
});
Это вернется false
если ничего не найдено, или индекс, если пользователь находится в коллекции.
Делать это красиво
Но так как вы, вероятно, будете использовать это в представлении, я бы упаковал его в сбруя, что-то вроде этого:
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
который вернется true
если в данный момент вошел в систему пользователь находится в отношениях commentLikes
или же false
если нет.
Использование:
if ($comment->commentLikes()->where('user_id', auth()->user()->id)->count() > 0)
Это более эффективным чем другие ответы, потому что оба метода where () и count () применяются к объекту построителя запросов вместо коллекции