模型关系查询如何缓存

项目里有模型关系渴求式查询,比如:

GoodsSku::with(['image','goods','favorites' => function(Builder $query) {$query->where('user_id', auth()->id())}])->paginate();

在赶进度时,这些查询写着舒服一时,现在要加缓存,请问怎么处理能少改一些代码?

我的想法是:最好能拆分成实体的缓存和列表的缓存。我在接触 Laravel 框架之前的经验都是自己组织 in 查询解决 N+1 问题,这样就比较容易加缓存:列表缓存一般只存有序的主键,列表缓存会冗余一些数据(比如固定查询头部 1000 条数据的主键,之后的不走缓存),再通过主键加载不同的实体数据,这时再查实体数据的缓存或根据主键的 IN 条件去库里查询数据。

大家平时是怎么加缓存的哪?

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
最佳答案

这个包你值得拥有:laravel-model-caching

4年前 评论
sanders (楼主) 4年前
sanders (楼主) 4年前
sanders (楼主) 4年前
讨论数量: 6

好问题,建议用英文给 laravel 提 issue

4年前 评论

这个包你值得拥有:laravel-model-caching

4年前 评论
sanders (楼主) 4年前
sanders (楼主) 4年前
sanders (楼主) 4年前

@leslieeilsel 如果更新了数据缓存可以自动更新吗?

4年前 评论
sanders (楼主) 4年前
jamesZhao (作者) 4年前
sanders (楼主) 4年前
jamesZhao (作者) 4年前
sanders (楼主) 4年前
jamesZhao (作者) 4年前
sanders

试用了一下 laravel-model-caching 这个包还是存在较大问题的无法用于生产环境,我用 tinker 试了一下:

$group=UserTagGroup::find(1); // 模型查询生成缓存
User::with('tags', 'tags.group')->get(); // 列表查询同时生成了缓存
$group->name='groupA';
$group->save();
UserTagGroup::find(1); // 这里的结果显示缓存已经被更新
User::with('tags', 'tags.group')->get(); // 这里的查询结果显示关系模型中的缓存没有被更新
4年前 评论
leslieeilsel 4年前
sanders (作者) (楼主) 4年前

@sanders 这个包对缓存器和 Laravel 版本的要求还挺苛刻的,请务必满足这些要求再进行测试。

file

4年前 评论
sanders (楼主) 4年前
sanders (楼主) 4年前