Laravel查询构建器:根据用户关联职位筛选聊天记录问题
解决方法
你的问题出在with()方法的用法上——with()只是用来预加载并过滤关联的jobs数据,但不会筛选Chat本身,所以会返回所有聊天记录,只是符合user_id条件的jobs会被加载,不符合的jobs为空。
要获取指定用户所属职位的聊天记录,需要用whereHas()来筛选存在符合条件关联的Chat,同时搭配with()预加载关联的jobs避免N+1查询:
$userId = 3; $chat = Chat::with(['jobs' => function($query) use($userId){ $query->where('user_id', $userId); }])->whereHas('jobs', function($query) use($userId){ $query->where('user_id', $userId); })->get();
如果你的关联关系定义正确(Chat属于Job,Job属于User),也可以通过嵌套关联简化查询:
$userId = 3; $chat = Chat::with('jobs.user') ->whereHas('jobs.user', function($query) use($userId){ $query->where('id', $userId); })->get();
关键逻辑说明:
whereHas('jobs', ...):只查询关联的jobs满足user_id=3的Chat记录,这一步才是真正筛选你需要的聊天数据with('jobs', ...):预加载这些Chat对应的符合条件的jobs数据,避免后续调用关联时产生N+1查询问题
内容的提问来源于stack exchange,提问作者Hendra
相关产品推荐
相关产品推荐

