在Yii 2中处理N + 1个查询

时间:2018-05-11 18:06:29

标签: activerecord yii yii2

有没有人知道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可以减少查询以获取两个对象。

有人对此有所了解吗?

1 个答案:

答案 0 :(得分:1)

您需要使用ActiveQuery::with()方法注册预先加载的加载规则。

$people = Person::find()->with('documents')->all();

这将创建2个查询 - 首先是加载所有人,第二个是加载与这些人相关的所有文档。

Lazy Loading and Eager Loading部分的Active Record文档中已经很好地解释了这一点。