mikebronner / laravel-model-caching

Eloquent model-caching made easy.
MIT License
2.22k stars 212 forks source link

Cache Not Clearing With morphTo/morphedByMany #431

Open reasecret opened 2 years ago

reasecret commented 2 years ago

I have Project, Service, User and Bookmark models. A user can bookmark a project, a service or another user.

Project, Service, Bookmark and User models are cachable.

User model:

public function bookmarkedProjects()
    {
        return $this->morphedByMany(Project::class, 'bookmarkable', 'bookmarks');
    }

public function bookmarkedUsers()
    {
        return $this->morphedByMany(User::class, 'bookmarkable', 'bookmarks');
    }

public function bookmarkedServices()
    {
        return $this->morphedByMany(Service::class, 'bookmarkable', 'bookmarks');
    }

Bookmark model:

public function bookmarkable()
    {
        return $this->morphTo();
    }

The problem is, when user deleted a bookmark, database record deleting but cache not flushing and there is no error. I have to use modelCache:clear. And if I remove Cachable from models there is no problem.

Delete function (Other functions are same. Except bookmarkable_type):

public function removeBookmarkedService(string $id)
    {
        Bookmark::where('bookmarkable_type', 'App\Models\Service')->where('user_id', Auth::user()->id)->where('bookmarkable_id', $id)->delete();

        $this->emit('refreshPage');
    }

Environment

bcaballero commented 1 week ago

Are there any other workarounds on this issue? aside from clearing model cache?

mikebronner commented 1 week ago

@reasecret Thanks for reporting this. @bcaballero I believe this might be due to the MorphToMany relationship -- it probably isn't enforced in caching.

It would really help if you could contribute a PR with a failing test, or even with the complete solution.