也不知道是不是 Laravel 里的 BUG,调试花费了一个上午......
本来代码是这样写的:
$data=Post::query()->with('users')->whereHas('users',function($query){
$query->where('status',1);
$query->where('type', 1);
})->orderBy('weight','desc')
->get();
以上打印出来的数据竟然查询出user表中status为3的,和type为3的用户的文章数据,随后我找了一下文档,又换了一个别的写法,如下:
$data=Post::query()->with(['users'=>function($query){
$query->where('status',1);
$query->where('type', 1);
}])->orderBy('weight','desc')
->get();
查询出正常的数据.
我就想问问这两种写法不是一样的吗?
关于 LearnKu
不一样,with是预加载。whereHas是关联查询
日志记录下sql语句或者,打印下sql语句就一目了然了。 :see_no_evil:
这里面两行什么意思??
问一下大家,都喜欢用那种查询啊?
@839891627 就是查询用户表type为1和status为1的用户啊
没错啊,文档中本来就是这样写的
查询数据是文章,没问题吧?
先要搞清楚whereHas和with 执行的 sql语句的语法含义
with 类似于sql的join
whereHas 类似于sql的where exists的语法
而且whereHas谨慎使用 数据量大的时候 会查询全表,执行效率特别慢,用不好的话 可以放弃whereHas
查找符合条件的关联用的是 whereHas 不能用 with
楼主说的 whereHas 特意去试了一遍。。。以下是输出
输出的sql语句正常,并没有什么bug。前端数据也正常。不太建议使用 whereHas ,效率贼低。
除此之外,1.检查一下sql语句 2.向上追溯源码3.检查一下关联模型和数据库信息
最重要的还是检查自己的代码,官网出低级bug的概率也贼低