Laravel 多层HasManyThrough关联计数 规避N+1查询方案
解决方案
以下两种方案都可以解决循环统计产生的N+1问题,你可以根据业务场景选择:
单条查询实现(性能最优)
不需要新增任何模型关联,直接通过关联表连接做聚合统计,最终只生成1条COUNT查询,修改Company.php中的对应方法即可:public function getTotalClicksToReviewSites() { return $this->locations() ->join('customers', 'customers.location_id', '=', 'locations.id') ->join('third_party_link_clicks', 'third_party_link_clicks.customer_id', '=', 'customers.id') ->count('third_party_link_clicks.id'); }该写法会自动带上当前公司的筛选条件,直接统计所有下属门店关联的有效点击总数,没有多余查询。
复用现有关联实现(可维护性最优)
如果不想硬编码表名,希望完全复用已定义的Eloquent关联,可以用预加载计数的写法,仅产生2条查询,后续关联逻辑调整时不需要修改这段统计代码:public function getTotalClicksToReviewSites() { return $this->locations() ->withCount('linkClicks') ->get() ->sum('link_clicks_count'); }其中第二条查询会自动通过
WHERE IN (门店ID列表)的方式批量拉取所有门店的点击计数,不会出现循环查询问题,和单条查询的性能差异在绝大多数业务场景下可以忽略,是日常开发优先推荐的写法。
内容的提问来源于stack exchange,提问作者Cat Named Dog
相关产品推荐
相关产品推荐

