也不知道是不是 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();

查询出正常的数据.
我就想问问这两种写法不是一样的吗?

失之东隅 , 收之桑榆
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
讨论数量: 9
宇宙最厉害

不一样,with是预加载。whereHas是关联查询

5年前 评论
QJAutumn (楼主) 5年前
Jennie

日志记录下sql语句或者,打印下sql语句就一目了然了。 :see_no_evil:

5年前 评论
QJAutumn (楼主) 5年前

这里面两行什么意思??

  $query->where('status',1);
    $query->where('type', 1);
5年前 评论

问一下大家,都喜欢用那种查询啊?

5年前 评论

@839891627 就是查询用户表type为1和status为1的用户啊

5年前 评论
839891627 5年前

没错啊,文档中本来就是这样写的

// 获取至少带有一条评论内容包含 foo% 关键词的文章...
$posts = App\Post::whereHas('comments', function (Builder $query) {
    $query->where('content', 'like', 'foo%');
})->get();

查询数据是文章,没问题吧?

5年前 评论
QJAutumn (楼主) 5年前
pigzzz (作者) 5年前
QJAutumn (楼主) 5年前
pigzzz (作者) 5年前
pigzzz (作者) 5年前

先要搞清楚whereHas和with 执行的 sql语句的语法含义

with 类似于sql的join
whereHas 类似于sql的where exists的语法

而且whereHas谨慎使用 数据量大的时候 会查询全表,执行效率特别慢,用不好的话 可以放弃whereHas

5年前 评论
❤seven 5年前
Epona

查找符合条件的关联用的是 whereHas 不能用 with

5年前 评论

楼主说的 whereHas 特意去试了一遍。。。以下是输出

WHERE EXISTS (SELECT * FROM `st_price` WHERE `st`.`id` = `st_price`.`st_id` AND `my_price` = '100')

输出的sql语句正常,并没有什么bug。前端数据也正常。不太建议使用 whereHas ,效率贼低。
除此之外,1.检查一下sql语句 2.向上追溯源码3.检查一下关联模型和数据库信息
最重要的还是检查自己的代码,官网出低级bug的概率也贼低

5年前 评论

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