Laravel关联查询疑问:如何在with关联的identities表添加where条件
给关联查询同时添加多表筛选条件的解决方案
嘿,当然可以!你完全能在这条Eloquent查询里同时给identities表加上筛选条件,而且不会影响sessions和device表的关联查询逻辑。只需要调整一下with方法里的关联嵌套结构就行,把identities的筛选和它的子关联放在同一个闭包里处理。
修改后的查询代码
$email_stats = User::with(['identities' => function($q) use ($venue_filter, $your_identity_condition) { // 在这里给identities表添加你的筛选条件,替换成实际字段和值 $q->where('your_identity_column', $your_identity_condition); // 继续关联sessions和device,并保留device表的venue_id筛选 $q->with(['sessions.device' => function($sub_q) use ($venue_filter) { $sub_q->where('venue_id', $venue_filter); }]); }])->where('id', $user_id)->first();
代码说明
- 我们把
identities的关联改成闭包形式,先在这个闭包里给identities表添加你需要的where条件(记得把your_identity_column和your_identity_condition换成你实际要筛选的字段和对应值)。 - 然后在同一个
identities的闭包里,通过with()方法继续嵌套sessions.device的关联查询,同时保留原来对device表的venue_id筛选逻辑。 - 最终返回的
User模型里,只会包含符合你筛选条件的identities记录,以及这些identities对应的sessions和符合venue_id要求的device数据。
额外提示
如果你希望只有当该用户存在符合条件的identities时才返回用户数据(而不是返回用户但关联数据为空),可以在主查询里追加whereHas条件:
$email_stats = User::with(['identities' => function($q) use ($venue_filter, $your_identity_condition) { $q->where('your_identity_column', $your_identity_condition); $q->with(['sessions.device' => function($sub_q) use ($venue_filter) { $sub_q->where('venue_id', $venue_filter); }]); }]) ->where('id', $user_id) ->whereHas('identities', function($q) use ($your_identity_condition) { $q->where('your_identity_column', $your_identity_condition); }) ->first();
这样就能完美实现你想要的多表关联筛选逻辑啦!
内容的提问来源于stack exchange,提问作者Luke Rayner
相关产品推荐
相关产品推荐

