如何在Laravel中通过Eloquent的with子句筛选同城市用户的Call数据?
实现同城市用户关联Call数据的筛选方案
核心思路
要获取与当前认证用户同城市的用户所关联的Call数据,关键是通过Call与User的关联关系,筛选出所属用户城市匹配当前用户的Call,同时预加载关联的用户信息避免N+1查询。
方法一:使用whereHas过滤关联模型
直接在Call查询中,通过whereHas筛选出所属用户城市符合条件的记录:
$currentUser = auth()->user(); // 仅保留所属用户与当前用户同城市的Call,并预加载用户信息 $calls = Call::with('user') ->whereHas('user', function ($query) use ($currentUser) { $query->where('city', $currentUser->city); }) ->get();
with('user'):预加载关联的用户数据,避免后续查询用户时产生N+1问题whereHas('user'):过滤出存在符合条件关联用户的Call,这里的条件是用户城市等于当前认证用户的城市
方法二:通过子查询筛选用户ID
如果需要复用同城市用户的ID列表,可以用子查询先获取同城市用户ID,再匹配Call的user_id:
$currentUser = auth()->user(); $calls = Call::with('user') ->whereIn('user_id', function ($query) use ($currentUser) { $query->select('id') ->from('users') ->where('city', $currentUser->city); }) ->get();
这种方式适合需要多次使用同城市用户ID集合的场景,逻辑更直观。
注意事项
- 确保User模型存在
city字段,Call模型的user_id外键与User表的id正确关联 - 若需处理未登录场景,可先通过
auth()->check()判断用户是否已认证,避免auth()->user()返回null引发错误
内容的提问来源于stack exchange,提问作者jesterfs
相关产品推荐
相关产品推荐

