也不知道是不是 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年前 评论