Laravel кэширует запросы к базе данных

я создал проект с ролями пользователей и разрешениями

Вот мои таблицы и модель

users--список пользователей приложения --Model Name [User],

roles --список ролей, доступных внутри приложения --Model Name [Role],

permissions -- список разрешений, доступных внутри приложения --Model Name [Permisions],

Вот мои таблицы отношений

role_user Которые поддерживают связь между таблицей roles и таблицей users

permission_role Которые поддерживают связь между таблицей permissions и таблицей roles

permission_user Которые содержат связь между таблицей permissions и таблицей users

Мой код отношений внутри модели

Модель User.php

/**
     * Many-to-Many relations with Role.
     *
     * @return \Illuminate\Database\Eloquent\Relations\HasMany
     */
    public function roles()
    {
        return $this->belongsToMany(Role::class);
    }
    /**
     * Many-to-Many relations with Permission.
     *
     * @return \Illuminate\Database\Eloquent\Relations\HasMany
     */
    public function permissions()
    {
        return $this->belongsToMany(Permission::class);
    }

   public function hasPermission($permission)
    {
        return $this->hasPermissionThroughRole($permission) || (bool) $this->permissions->where('name',$permission->name)->count();
    }

    public function hasPermissionThroughRole($permission)
    {
        foreach($permission->roles as $role)
        {
            if($this->roles->contains($role))
            {
                return true;
            }
        }
        return false;
    }

    public function hasRoles($roles)
    {
        $roles = is_array($roles) ? $roles : func_get_args();
        foreach ($roles as $role) 
        {
            if ($this->hasRole($role)) 
            {
                return true;
            }
        }
        return false;
    }
    /**
     * Returns if the given user has an specific role.
     *
     * @param string $role
     *
     * @return bool
     */
    public function hasRole($role)
    {
        return $this->roles
            ->where('name', $role)
            ->first() != null;
    }

Модель Role.php

/**
     * Many-to-Many relations with Permissions.
     *
     * @return \Illuminate\Database\Eloquent\Relations\HasMany
     */
    public function permissions()
    {
        return $this->belongsToMany(Permission::class);
    }
    /**
     * Many-to-Many relations with Users.
     *
     * @return \Illuminate\Database\Eloquent\Relations\HasMany
     */
    public function users()
    {
        return $this->belongsToMany(User::class);
    }

Модель Permission.php

/**
     * Belongs-to-Many relations with Role.
     *
     * @return \Illuminate\Database\Eloquent\Relations\HasMany
     */
    public function roles()
    {
        return $this->belongsToMany(Role::class);
    }
    /**
     * Belongs-to-Many relations with User.
     *
     * @return \Illuminate\Database\Eloquent\Relations\HasMany
     */
    public function users()
    {
        return $this->belongsToMany(User::class);
    }
    /**
     * Belongs-to-Many relations with Modules.
     *
     * @return \Illuminate\Database\Eloquent\Relations\belongsToMany
     */

И затем, наконец, я создал ServiceProvider с именем

PermissionServiceProvider

и внутри метода загрузки поставщика услуг я добавил код

public function boot()
    {
        if (Schema::hasTable('permissions'))
        {         
             Permission::get()->map(function ($permission) 
             {
                 Gate::define($permission->name, function ($user) use ($permission) 
                {
                     return $user->hasPermission($permission);
                 });
             });


        }

        Blade::directive('role', function ($role)
            {
               return "<?php if(Auth::user()->hasRole({$role})): ?>";
            });
        Blade::directive('endrole', function ($role)
            {
                return "<?php endif; ?>";
            });
    }

Все функции и отношения работают нормально, но запросы выполняются каждый раз, когда я нажимаю кнопку обновления Выполнение запросов

Есть ли способ кэшировать все разрешения и роли для вошедшего в систему пользователя?

Отредактировано

В соответствии с некоторыми предложениями я пробовал пакет кеша laravel

Это не работает для меня


person Manojkiran.A    schedule 11.12.2018    source источник


Ответы (1)


Вы ищете пакет кэширования модели laravel https://github.com/GeneaLabs/laravel-model-caching.

Я рекомендую установить пакет с Redis. Также это очень полезно при работе с очередями.

Работает как положено. Скриншоты из моего проекта.

До:

введите здесь описание изображения

После:

введите здесь описание изображения

person IndianCoding    schedule 11.12.2018
comment
есть ли способ создать собственное кэширование модели - person Manojkiran.A; 11.12.2018
comment
Да, в laravel есть встроенные инструменты laravel.com/docs/5.7/cache. Но я думаю, что вы потратите много времени, чтобы подготовить его ко всем методам и отношениям модели. - person IndianCoding; 11.12.2018
comment
у вас есть идеи, как сделать проект с ролями пользователей и разрешениями в laravel без какого-либо пакета - person Manojkiran.A; 11.12.2018
comment
Нет, я не писал свою собственную систему кэширования на laravel. Но я предполагаю, что для этого вам придется написать свой собственный построитель запросов. Так что, похоже, играть не стоит. - person IndianCoding; 11.12.2018