关联查询怎么做到关联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));
            })
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
讨论数量: 7

whereHaswith 前面试试? :joy:

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

可以看看 whereNotNull

4年前 评论

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

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

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

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

同意楼上,whereHas 就行了

4年前 评论

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

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

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

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

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

whereHas 生成的 SQL`

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

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

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

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