有个关于 Laravel with 关联查询的问题困扰我了

就是我有with查询使用场景,然后with的表的字段需要用到模糊匹配查询,但是with里面使用不到模糊查询是为什么,我也有把全过程的查询原生sql语句打印出来,发现并没有走到with里面的模糊查询,后面只能用联表查询解决

请回答2016
HACK_QC
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 11

whereHas()了解一下。

4年前 评论
HACK_QC

@loveinalife whereHas()有一个查询是用过,可以去过滤条件,但是好像也不会走模糊匹配查询吧

4年前 评论
HACK_QC

@loveinalife 嗯嗯,我之前试了不行,把整个过程的sql原生打印出来没看到关联的表里面有模糊查询的语句,比较疑惑

4年前 评论

你的需求是用with查一对多的数据吗,然后用like筛选子表数据?

4年前 评论

with使用回调函数查不出来吗,我记得以前用过一次,不知道可不可以

$name = 'Test';
$Model = Model::with(['xxx'=>function($query) use ($name) {
    return $query->where('name','like',"%$name%");
}]);
4年前 评论
HACK_QC

@邪恶的咖啡 这个试过了也是不可以的,之前是这么写的,原生sql没有看到执行到这层的模糊查询语句

4年前 评论
HACK_QC

@loveinalife 就是列表数据,然后有关联的几张表,with里面的子表有需要模糊匹配的字段

4年前 评论

@HACK_QC 可是我确实能通过with用回调的方式能模糊查询,这是我刚才做的一个测试数据

return Name::find(1)->with(['art' => function($query){
    return $query->where('art_id','like',"%宇%");
}])->get();

返回结果为:

 {
        "id": 1,
        "name": "官方",
        "art": [
            {
                "id": 1,
                "name_id": "1",
                "art_id": "王小宇"
            },
            {
                "id": 4,
                "name_id": "1",
                "art_id": "刘宇"
            }
      ]
}

改一下数据

return Name::find(1)->with(['art' => function($query){
    return $query->where('art_id','like',"%王%");
}])->get();

返回结果为:

 {
        "id": 1,
        "name": "官方",
        "art": [
            {
                "id": 1,
                "name_id": "1",
                "art_id": "王小宇"
            },
            {
                "id": 2,
                "name_id": "1",
                "art_id": "王聚集"
            }
        ]
}
4年前 评论

@HACK_QC 我想你应该是代码出现了问题,或者你应该贴出代码,包括Model的关联查询方法,更容易让大牛分析问题原因。

4年前 评论
HACK_QC

@邪恶的咖啡 好的,我明天再重新测试下,可能是我sql语句没打全,sql语句是没错的,我也是这么写的

4年前 评论

whereHas 和 with 同时用,whereHas 只是用来做判断的,如果能看到有 exists 的 sql 说明写对了

4年前 评论

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