You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:23:41