有没有人知道Yii的ActiveRecord是否有帮助我们阻止N + 1查询的功能?
在下面的示例中,我们需要从人们那里获取文档,并在视图中显示人员的姓名及其文档列表。如果我使用$ model-> findAll([...]);类似下面的代码:
<?php foreach( $people as $person ): ?>
<li><?= $person->name</li>
<li>
<ul>
<?php foreach( $person->documents as $document ): ?>
<li><?= $document->number; ?></li>
<?php endforeach; ?>
</ul>
</li>
<?php endfoeach; ?>
Yii会多次查询数据库。 在Ruby on Rails的ActiveRecord中,他们有一个include方法,我们可以使用以下内容:People.includes(&#39; documents&#39;)。
通过这种方式,ActiveRecord可以减少查询以获取两个对象。
有人对此有所了解吗?
答案 0 :(得分:1)
您需要使用ActiveQuery::with()
方法注册预先加载的加载规则。
$people = Person::find()->with('documents')->all();
这将创建2个查询 - 首先是加载所有人,第二个是加载与这些人相关的所有文档。
在Lazy Loading and Eager Loading部分的Active Record文档中已经很好地解释了这一点。