如何用Laravel子查询实现关联数据求和?
- 内容介绍
- 文章标签
- 相关推荐
本文共计996个文字,预计阅读时间需要4分钟。
如果只想查询主模型的某个字段的总和,同时希望获得最轻量级、最直观的选择,可以使用以下方法:
常见错误是以为它支持嵌套关联或复杂条件——其实不支持。比如 User::withSum('posts.comments', 'votes') 会报错,Laravel 不允许跨两级关联直接求和。
- 只支持一级关联:如
posts、orders,不能是posts.comments - 第二个参数必须是字段名字符串,不能是表达式(如
'price * quantity') - 结果以
{relation}_sum_{column}形式注入模型属性,例如$user->posts_sum_views
示例:
User::withSum('orders', 'total')->get();生成的 SQL 类似:SELECT *, SUM(orders.total) AS orders_sum_total FROM users LEFT JOIN orders ON users.id = orders.user_id GROUP BY users.id
手动写子查询用 addSelect() + selectRaw()
需要跨多级关联、加 WHERE 条件、或对表达式求和时,就得自己构造子查询。核心是用 addSelect() 把子查询结果作为额外字段塞进主查询,避免 N+1 或多次查询。
容易踩的坑是子查询里没正确关联外层表,导致结果全为 NULL 或重复计数。
本文共计996个文字,预计阅读时间需要4分钟。
如果只想查询主模型的某个字段的总和,同时希望获得最轻量级、最直观的选择,可以使用以下方法:
常见错误是以为它支持嵌套关联或复杂条件——其实不支持。比如 User::withSum('posts.comments', 'votes') 会报错,Laravel 不允许跨两级关联直接求和。
- 只支持一级关联:如
posts、orders,不能是posts.comments - 第二个参数必须是字段名字符串,不能是表达式(如
'price * quantity') - 结果以
{relation}_sum_{column}形式注入模型属性,例如$user->posts_sum_views
示例:
User::withSum('orders', 'total')->get();生成的 SQL 类似:SELECT *, SUM(orders.total) AS orders_sum_total FROM users LEFT JOIN orders ON users.id = orders.user_id GROUP BY users.id
手动写子查询用 addSelect() + selectRaw()
需要跨多级关联、加 WHERE 条件、或对表达式求和时,就得自己构造子查询。核心是用 addSelect() 把子查询结果作为额外字段塞进主查询,避免 N+1 或多次查询。
容易踩的坑是子查询里没正确关联外层表,导致结果全为 NULL 或重复计数。

