Laravel 7 Blade组件多次调用重复查询数据库的优化咨询
2. 单次查询的实现方案
有三种常用方案可以解决该问题,可根据实际场景选择:
- 请求级静态缓存(最优,适合同请求参数一致的场景)
直接修改FilterService的getAllMakes()方法,添加静态变量做同请求缓存,相同limit参数的调用只会执行一次查询:public function getAllMakes($limit = -1) { // 静态变量仅在当前请求生命周期内有效 static $makesCache = []; $cacheKey = 'limit_' . $limit; // 已缓存过直接返回 if (isset($makesCache[$cacheKey])) { return $makesCache[$cacheKey]; } // 原有查询逻辑 $makes = Make::when($limit > 0, function ($query) use ($limit) { return $query->limit($limit); })->get(); // 写入缓存后返回 return $makesCache[$cacheKey] = $makes; } - 全局持久化缓存(适合品牌列表更新频率低的场景)
给查询加Laravel缓存,设置合理的过期时间,跨请求也能复用查询结果,进一步降低数据库压力:public function getAllMakes($limit = -1) { return cache()->remember('all_makes_limit_' . $limit, 600, function () use ($limit) { // 原有查询逻辑 return Make::when($limit > 0, fn($q) => $q->limit($limit))->get(); }); } - 父层传参(适合参数灵活变化的场景)
在页面对应的控制器中提前查询一次品牌列表,然后作为props传递给所有调用的MakeUl组件,组件构造函数去掉查询逻辑,直接接收外部传入的$makes参数即可。
3. 当前组件使用方式合理性评估
整体思路符合Blade组件封装复用的设计目标,属于合理的使用方式,但存在几个可优化的点:
- 数据查询耦合在组件构造函数中,没有做缓存,导致重复查询问题
- 构造函数参数
$showInventoryCount传参后被强制赋值为0,参数定义失效,属于代码bug FilterService是直接new实例化的,没有用Laravel依赖注入,不利于后续单元测试
内容的提问来源于stack exchange,提问作者Mubashir Khan
相关产品推荐
相关产品推荐

