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

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

失之东隅 , 收之桑榆
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 9
宇宙最厉害

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

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

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

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

这里面两行什么意思??

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

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

4年前 评论

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

4年前 评论
839891627 4年前

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

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

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

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

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

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

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

4年前 评论
❤seven 4年前
Epona

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

4年前 评论

楼主说的 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的概率也贼低

4年前 评论

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