Laravel Builder实现关联表多统计查询问题求助
解决方案
直接用Illuminate\Database\Query\Builder(即DB门面的查询构造器)实现,核心通过左关联邀请表+聚合函数分别统计两项数据:
use Illuminate\Support\Facades\DB; $userStats = DB::table('users') ->leftJoin('user_invitations', 'users.id', '=', 'user_invitations.sender_id') ->groupBy('users.id', 'users.name') // 根据需求添加users表需展示的字段 ->select([ 'users.id', 'users.name', DB::raw('COUNT(user_invitations.id) as total_invitations'), // 发送的邀请总数 DB::raw('COUNT(user_invitations.recipient_user_id) as registered_invitations') // 邀请带来的注册用户数 ]) ->get();
关键细节说明:
- 左关联(leftJoin):保证没发送过邀请的用户也能被统计到(两项数值均为0)
- COUNT(user_invitations.id):统计所有发送的邀请——邀请表的id为每条邀请的唯一标识,只要存在就计入总数
- COUNT(user_invitations.recipient_user_id):仅统计完成注册的邀请——假设
recipient_user_id在用户注册后会填充为新用户ID,未注册时为null,COUNT函数会自动忽略null值 - groupBy约束:必须包含users表中所有非聚合查询字段,避免SQL模式报错
如果你的user_invitations表用其他字段标记注册状态(比如is_registered布尔字段),可以把注册数统计改成:
DB::raw('SUM(CASE WHEN user_invitations.is_registered = 1 THEN 1 ELSE 0 END) as registered_invitations')
内容的提问来源于stack exchange,提问作者Iyti
相关产品推荐
相关产品推荐

