关于Laravel框架中Eloquent的多个模型关联间WhereOr条件如何书写?

背景介绍

我在书写代码的时候,遇见一个需求,用户发起咨询后,可以针对该咨询进行备注,通过关键词搜索,用户真实姓名或备注昵称等于特定搜索值,即满足其中任一条件,即查询出该条记录。

现在有三张表
A表 咨询表
B表 用户表
C表 备注表

当用户发起咨询后,会在A表内创建记录
A表(咨询表)会包含 B表(用户表)的ID,关联用户信息
C表(备注表)会包含A表(咨询表的)ID,存储的是针对该咨询添加的备注信息。

问题描述

即查询时,A表会关联B表与C表,搜索条件为 B中的name或者C中的name等于搜索值即满足条件。

这个查询语句应该如何写呢?
希望了解的大神或者做过的同学帮忙解答一下,感谢~

附目前没有搜索条件的Sql:

A::with('B:id,name,avatar_url', 'C:id,name')
            ->has('B')
            ->whereHas('C', function (Builder $query) {
                $query->where('type', '=', 1);
            })
            ->simplePaginate($this->pageNum);
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案

已解决,通过两层闭包解决,代码如下,望指点~

 $obj = A::with('B:id,nick_name,avatar_url', 'C:clue_id,name')
            ->has('B')
            ->whereHas('C', function (Builder $query) {
                $query->where('type', '=', 1);
            });

        //检测是否有外部输入参数,如有,进行两个模型关联间的whereOr条件分组
        if (isset($param['keyword']) && !empty($param['keyword'])) {
            $obj->where(function (Builder $query) use ($param) {
                $query
                    ->whereHas('B', function (Builder $query) use ($param) {
                        $query->where('nick_name', 'like', "%" . $param['keyword'] . "%");
                    })
                    ->orWhereHas('C', function (Builder $query) use ($param) {
                        $query->where('name', 'like', "%" . $param['keyword'] . "%");
                    });
            });
        }

        return $obj
            ->orderBy("time", "desc")
            ->simplePaginate($this->pageNum);
3年前 评论
91it 3年前
讨论数量: 2
A::selectRaw('a.*,b.*,c.*')
->leftjoin('b','b.a_id','a.id')
->leftjoin('c','c.a_id','a.id')
->where(function($query){
    $query->where('a.x','xxx')
        ->orwhere('b.x','xxx')
        ->orwhere('c.x','xxx')
})
3年前 评论
AlbertZhang (楼主) 3年前

已解决,通过两层闭包解决,代码如下,望指点~

 $obj = A::with('B:id,nick_name,avatar_url', 'C:clue_id,name')
            ->has('B')
            ->whereHas('C', function (Builder $query) {
                $query->where('type', '=', 1);
            });

        //检测是否有外部输入参数,如有,进行两个模型关联间的whereOr条件分组
        if (isset($param['keyword']) && !empty($param['keyword'])) {
            $obj->where(function (Builder $query) use ($param) {
                $query
                    ->whereHas('B', function (Builder $query) use ($param) {
                        $query->where('nick_name', 'like', "%" . $param['keyword'] . "%");
                    })
                    ->orWhereHas('C', function (Builder $query) use ($param) {
                        $query->where('name', 'like', "%" . $param['keyword'] . "%");
                    });
            });
        }

        return $obj
            ->orderBy("time", "desc")
            ->simplePaginate($this->pageNum);
3年前 评论
91it 3年前

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