root09
@root09

Как правильно проверять находится ли пост в закладках пользователя?

Есть страница где выводятся посты, есть пользователь, у пользователя есть модель 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, я так понимаю это очень плохо?
  • Вопрос задан
  • 150 просмотров
Решения вопроса 1
Fernus
@Fernus
Техник - Механик :)
В модели постов нужно добавить отношение с привязкой к юзерам, которые их добавили...в моём коде это bookmark_users...

<?php

$CURRENT_USER_ID = \Auth::user()->id;

$posts = Post::with([
    'bookmark_users' => function($q) use($CURRENT_USER_ID) {
            $q->where('id', $CURRENT_USER_ID);
        }
    ])
    ->get();

foreach ($posts as $item) {
    
    if($item->bookmark_users->count() > 0) {
        
        // Удалить
        
    }else{
        
        // Добавить
        
    }
    
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@jazzus
$posts = Post::withExists(['bookmarks' => function ($query) {
    $query->where('user_id', Auth::id());
}])
    ->get();

во вьюхе проверять
$post->bookmarks_exists
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы