关于joinWith查询的疑问
程序员文章站
2022-05-29 21:55:47
...
大家好,请问使用joinWith后,我看debug的sql记录,发现会多出来一条查询。
如 有表table_a、table_b关系为table_a.classid = table_b.id
使用如下查询后
$query = info::find()->select(['table_a.*','table_b.name');
$query->joinWith('infoClass');
生成sql大致如下
SELECT * FROM `table_a` LEFT JOIN `table_b` ON `table_a`.`classid` = `table_b`.`id` LIMIT 20
然后会多一个查询
SELECT * FROM `table_b` WHERE `id` IN ('3', '7')
问题是我之前的查询已经 获取到了table_b的内容了。
所以第二条sql 我个人认为没有必要在去查询一次数据库了。
请问大家,是如何避免这个二次查询的。 或者这个二次查询是有什么必要?
请大家解答,谢谢。
回复内容:
大家好,请问使用joinWith后,我看debug的sql记录,发现会多出来一条查询。
如 有表table_a、table_b关系为table_a.classid = table_b.id
使用如下查询后
$query = info::find()->select(['table_a.*','table_b.name');
$query->joinWith('infoClass');
生成sql大致如下
SELECT * FROM `table_a` LEFT JOIN `table_b` ON `table_a`.`classid` = `table_b`.`id` LIMIT 20
然后会多一个查询
SELECT * FROM `table_b` WHERE `id` IN ('3', '7')
问题是我之前的查询已经 获取到了table_b的内容了。
所以第二条sql 我个人认为没有必要在去查询一次数据库了。
请问大家,是如何避免这个二次查询的。 或者这个二次查询是有什么必要?
请大家解答,谢谢。
joinWith其实接收三个参数, 其中第二参数指定是否启用贪婪加载,它默认是 true 就是启用,也就是你所看到的,会去根据主表查询出所有的relation。
要想禁用在调用 joinWith 的时候传入第二参数,并设置为 false, 那么就不会再去执行下面的SQL了
上一篇: 派生类数据库 单利模式
下一篇: php之将用户信息写入数据库
推荐阅读
-
Sql学习第三天——SQL 关于CTE(公用表达式)的递归查询使用
-
关于SQL Server查询语句的使用
-
sqlserver关于分页存储过程的优化【让数据库按我们的意思执行查询计划】
-
关于JSP的一点疑问小结
-
Sql学习第三天——SQL 关于CTE(公用表达式)的递归查询使用
-
关于mysql查询字符集不匹配问题的解决方法
-
关于SQL Server查询语句的使用
-
SQL Server 关于 Table 字典数据的查询SQL
-
关于“关于C#装箱的疑问”帖子的个人看法 (原发布csdn 2017年10月07日 10:21:10)
-
关于Django ForeignKey 反向查询中filter和_set的效率对比详解