Кеширование в laravel запросов к БД

73
06 ноября 2021, 08:00

Нужен совет, возможно решить мою проблему кешированием или как то по другому.

Есть самодельная Learning Management System очень скудного функционала под 200-300 пользователей.

Но вот проблема, чтобы в топбаре показать уведомления, непрочитанные внутренние сообщения, прогресс обучения и онлайн обучающихся, я загнал все это в ViewComposer и в результате получилось 90 запросов к бд при каждом запросе страниц.

Вот вывод из debugbar bit.ly/32JR86a.

Как решаются такие вопросы? Ведь вывод всей этой информации — типовая задача для многих проектов, а я велосипед изобретаю с квадратными колесами. Вот класс компосера:

    class ShareComposer
{
    protected $user;
    protected $profile;
    protected $notifications;
    public function __construct()
    {
        $this->user = Auth::user();
        if ($this->user != null) {
            $this->notifications = $this->user->unreadNotifications;
        }
    }
    public function compose(View $view)
    {
        if ($this->user != null) {
            $roles = $this->user->getRoleNames();
            $unreadMessagesCount = $this->user->unreadMessagesCount();
            $unreadThreads = Thread::forUserWithNewMessages(Auth::id())->latest('updated_at')->get();
            if ($roles->contains('administrator')) {
                $homeworksResultsCount = HomeWorkResult::where('accepted', 0)->where('checked', 0)->count();
                $guestsCount = Guest::where('accepted', 0)->where('checked', 0)->count();
                $view->with([
                    'user' => $this->user,
                    'notifications' => $this->notifications,
                    'unreadMessagesCount' => $unreadMessagesCount,
                    'homeworkResultsCount' => $homeworksResultsCount,
                    'guestsCount' => $guestsCount,
                    'unreadThreads' => $unreadThreads
                ]);
            }
            if ($roles->contains('student')) {
                $current_lesson = User::find($this->user->id)->lessons()->orderBy('position', 'desc')->first();
                $current_lesson_id = $current_lesson->id;
                $time_to_learn = $current_lesson->time_to_learn;
                $lesson_student = DB::table('lesson_student')->where('user_id', $this->user->id)->where('lesson_id', $current_lesson_id)->get();
                $start_time = Carbon::parse($lesson_student->pluck('created_at')[0]);
                $end_time = $start_time->addDays($time_to_learn);
                $date_now = Carbon::today();
                $remain_days = $end_time->diffInDays($date_now);
                $view->with([
                    'user' => $this->user,
                    'notifications' => $this->notifications,
                    'unreadMessagesCount' => $unreadMessagesCount,
                    'remain_days' => $remain_days,
                    'unreadThreads' => $unreadThreads
                ]);
            }
            if ($roles->contains('user')) {
                $view->with([
                    'user' => $this->user,
                    'notifications' => $this->notifications,
                    'unreadMessagesCount' => $unreadMessagesCount,
                    'unreadThreads' => $unreadThreads
                ]);
            }
        }
    }
}
READ ALSO
не работает exec() в php

не работает exec() в php

не отрабатывает

291
Отобразить данные из двух таблиц

Отобразить данные из двух таблиц

Есть две таблицы sql: Одна с заказами, а другая со статусами заказов:

91
Интервал между начальной и финальной меткой времени

Интервал между начальной и финальной меткой времени

Есть у меня в программе функция отключения уведомлений по заданому времениТо есть условие такое, если current hour == 12 отключаю

92
Не подключается к БД MySql через Java JDBC

Не подключается к БД MySql через Java JDBC

Работаю в NetbeansНикак не могу подключить

226