Heim  >  Artikel  >  Backend-Entwicklung  >  关于joinWith查询的疑问

关于joinWith查询的疑问

WBOY
WBOYOriginal
2016-06-06 20:34:431214Durchsuche

大家好,请问使用joinWith后,我看debug的sql记录,发现会多出来一条查询。

如 有表table_a、table_b关系为table_a.classid = table_b.id
使用如下查询后

<code>$query = info::find()->select(['table_a.*','table_b.name');

$query->joinWith('infoClass');
</code>

生成sql大致如下

<code>SELECT * FROM `table_a` LEFT JOIN `table_b` ON `table_a`.`classid` = `table_b`.`id`  LIMIT 20
</code>

然后会多一个查询

<code>SELECT * FROM `table_b` WHERE `id` IN ('3', '7')
</code>

问题是我之前的查询已经 获取到了table_b的内容了。
所以第二条sql 我个人认为没有必要在去查询一次数据库了。

请问大家,是如何避免这个二次查询的。 或者这个二次查询是有什么必要?

请大家解答,谢谢。

回复内容:

大家好,请问使用joinWith后,我看debug的sql记录,发现会多出来一条查询。

如 有表table_a、table_b关系为table_a.classid = table_b.id
使用如下查询后

<code>$query = info::find()->select(['table_a.*','table_b.name');

$query->joinWith('infoClass');
</code>

生成sql大致如下

<code>SELECT * FROM `table_a` LEFT JOIN `table_b` ON `table_a`.`classid` = `table_b`.`id`  LIMIT 20
</code>

然后会多一个查询

<code>SELECT * FROM `table_b` WHERE `id` IN ('3', '7')
</code>

问题是我之前的查询已经 获取到了table_b的内容了。
所以第二条sql 我个人认为没有必要在去查询一次数据库了。

请问大家,是如何避免这个二次查询的。 或者这个二次查询是有什么必要?

请大家解答,谢谢。

joinWith其实接收三个参数, 其中第二参数指定是否启用贪婪加载,它默认是 true 就是启用,也就是你所看到的,会去根据主表查询出所有的relation。

要想禁用在调用 joinWith 的时候传入第二参数,并设置为 false, 那么就不会再去执行下面的SQL了

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn