You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 01:48:15