Есть страница где выводятся посты, есть пользователь, у пользователя есть модель Bookmark, в которой хранятся закладки на посты. (user_id, post_id)
На странице со списком с постами нужно показывать кнопку добавить/удалить закладку на пост в зависимости от того есть ли в закладках или нет.
Как это правильно сделать?
Сейчас у меня посты выводятся через foreach и я просто внутрь добавил проверку, но это дает нагрузку.
@foreach($posts as $post)
<div class="post">
@if(Auth::check() && isset(Auth::user()->bookmarkCached[$post->id]))
<button>Удалить закладку</button>
@else
<button>Добавить закладку</button>
@endif
</div>
@endforeach
bookmarkCached() - это мутатор в котором находится связь bookmarks кэшированная и переведенная в массив с id постами.
Как это правильно сделать и оптимизировать?
В модели User
public function bookmarks()
{
return $this->hasMany('App\Models\Bookmark');
}
public function getBookmarkCachedAttribute()
{
return Cache::remember('bookmarks_cached_list_'.$this->id, 3600, function () {
$arr = $this->bookmarks->toArray();
$new_arr = [];
foreach ($arr as $item)
{
$new_arr[] = $item['post_id'];
}
return $new_arr;
});
}
Смотрю через debugbar ларавела, без этих функций в разделе timeline графа application 200ms скорость, а с этими функциями 450ms, я так понимаю это очень плохо?