关联查询如何模糊查询关联表 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.加上一个下拉框,如果选择了栏目就查询当前栏目下面的所有文章
我的做法
在模型中已经做好的关联 如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.'%');
});
我试了也可以查询成功
所以请用 PHPStorm
when
方法会把第一个参数 作为回调函数的第二个参数传进去, 源码如下详情见文档 查询构造器
谨慎使用 whereHas
@HI 为啥?你是考虑到性能问题吗?
whereHas 与 whereIn类似,比较考验查询子句字段,如果查询子句字段没做索引,可能会拖累整个查询语句的速度
Builder
是一个类啊。编辑器会自动识别类下面的方法,对于代码运行而言,你不标明类型也是可以运行的