关联查询怎么做到关联ModelB不存在条件数据则ModelA同时不反回这条数据?

$playServices = PlayService::with('play_user:id,sex')
            ->whereHas('play_user', function (Builder $query) use ($request, $sex) {
                $query->when($request->has('sex'), function ($query) use ($sex) {
                    $query->where('sex', intval($sex));
                });
            })
            ->simplePaginate(30);

PlayService 属于 PlayUser
现在是以PlayService为主查询,play_user中数据不存在时最终的结果返回为

"data": [
            {
                "field" : "xxxx",
                "play_user": null
            }
        ],

怎么做到当play_user不存在数据时这一整条数据都被过滤掉?类似与DB的关联查询。

已解决,whereHas经过测试并没有实现。
解决方案使用rightJoin以play_user为主表查询

PlayService::rightJoin('play_users', 'play_services.play_user_id', '=', 'play_users.id')
            ->when($request->has('sex'), function ($query) use ($sex) {
                $query->where('play_users.sex', intval($sex));
            })
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 7

whereHaswith 前面试试? :joy:

3年前 评论
MyPuppet (楼主) 3年前

可以看看 whereNotNull

3年前 评论

还没关联怎么wherehas...肯定直接报错呀

没试过没发言权哦,这个不会报错的,whereHaswith 是两个功能,互不影响。

代码提供的太少,无法判断,看你代码使用 whereHas 是没有问题的,能达到你的要求。

3年前 评论
MyPuppet (楼主) 3年前

同意楼上,whereHas 就行了

3年前 评论

你的play_user返回了null,你可以检查一哈你的play_user和play_service的关联字段,这个是必须要放到with的查询中才能返回数据,whereHas最后是走的原生SQL的exists,在你的模型关联没错的基础上,肯定是限制返回数据了的

3年前 评论
 {
                "field" : "xxxx",
                "play_user": null
            }

看你这个应该是没有把play_service表关联play_user的字段查出来

3年前 评论
MyPuppet (楼主) 3年前
小猪蹄子 (作者) 3年前
小猪蹄子 (作者) 3年前

@MyPuppet 我不信,真的,不信。你代码贴的太少了,也不知道你是怎么打印出来的那个 json

whereHas 生成的 SQL`

select * from `xxx` where `xxx_id` ... exists (select xxx from xxx)

如果说符合条件,列表就没有这条数据,从何而来的这个json

3年前 评论
MyPuppet (楼主) 3年前
Adachi (作者) 3年前
Adachi (作者) 3年前
Adachi (作者) 3年前
MyPuppet (楼主) 3年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!