关联查询如何模糊查询关联表 B 的某个字段的值 [已解决,但是不明白,求解答]

如:

数据表

用户表 user

id name

栏目表 categories

id name

文章表 article

id  title  content user_id categorie_id

需求

1.列出所有的文章

1  文章1  作者1
2  文章2  作者2
3  文章3  作者3
4  文章4  作者4
5  文章5  作者5

2.加上一个搜索作者的input框,输入作者的名字然后查询出这个作者下面的所有文章,,,,,就是这 卡住了我的脖子

关联查询如何查询 关联表的某个字段的值

3.加上一个下拉框,如果选择了栏目就查询当前栏目下面的所有文章

关联查询如何模糊查询关联表 B 的某个字段的值【已解决,但是不明白,求解答】

我的做法

在模型中已经做好的关联 如with

$articles = Article::with(['user','categories'])
        ->when($request->get('categorie_id'), function ($query, $categorie_id) {\
  return $query->where('categorie_id', $e);\
})
        //使用when方法进行判断
            ->when($request->get('title'), function ($query, $title) {
                $query->whereHas('user', function () use ($query,$title) {
                    return $query->where('name', 'like','%'.$name.'%');
                });
            })
->orderBy('created_at','desc')
->paginate(15);
           我还天真的认为这个方法也可以!!!!
            ->when($request->get('title'), function ($query, $title) {
                return $query->where('user.name', 'like','%'.$title.'%');
            })

然后自己尝试了下,竟然解决了,但是不懂为啥

我看手册 需要加一个 Builder ,然后我就改成了 下面语法 竟然成功查询出来了 之前的我随便勾选的栏目也查询了出来,问题是我没有传递 $query 啊, 他怎么查询的?Builder 能把 之前的 查询 栏目后的 $query语句给i装进去???

                $query->whereHas('user', function (Builder $query) use ($title) {
                    return $query->where('name', 'like','%'.$name.'%');
                });

问题是 when方法里面 ,我没有传递之前的查询栏目的 $query ,竟然 也可以根据栏目 和 模糊的名字查询出来 案例说 应该这么写

                $query->whereHas('user', function ($query) use ($title) {
                    return $query->where('name', 'like','%'.$name.'%');
                });

我试了也可以查询成功

那么问题来了 Builder 是怎么知道我之前选择了那个栏目? 这个不太懂啊

whereHas orWhereHas whereDoesntHave orWhereDoesntHave 这四个有啥区别?

《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 6
leo

file

所以请用 PHPStorm

4年前 评论
liuhaiqiang999 (楼主) 4年前
nfangxu

when 方法会把第一个参数 作为回调函数的第二个参数传进去, 源码如下


    /**
     * Apply the callback's query changes if the given "value" is true.
     *
     * @param  mixed  $value
     * @param  callable  $callback
     * @param  callable  $default
     * @return mixed|$this
     */
    public function when($value, $callback, $default = null)
    {
        if ($value) {
            return $callback($this, $value) ?: $this;
        } elseif ($default) {
            return $default($this, $value) ?: $this;
        }

        return $this;
    }

详情见文档 查询构造器

4年前 评论
Complicated

@HI 为啥?你是考虑到性能问题吗?

4年前 评论

whereHas 与 whereIn类似,比较考验查询子句字段,如果查询子句字段没做索引,可能会拖累整个查询语句的速度

4年前 评论

Builder是一个类啊。编辑器会自动识别类下面的方法,对于代码运行而言,你不标明类型也是可以运行的

4年前 评论

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