Работа с N + 1 запросов в Yii 2 - PullRequest
0 голосов
/ 11 мая 2018

Кто-нибудь знает, есть ли в 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 будет много раз запрашивать базу данных.В ActiveRecord в Ruby on Rails есть метод include, в котором мы можем использовать что-то вроде: People.include ('documents').

Таким образом ActiveRecord делает запросы менее тяжелыми, чтобы получить оба объекта.

Кто-нибудь знает что-нибудь об этом?

1 Ответ

0 голосов
/ 11 мая 2018

Вам необходимо использовать метод ActiveQuery::with() для регистрации правил активной загрузки.

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

Это создаст 2 запроса - первый для загрузки всех лиц, второй для загрузки всех документов, связанных с этими людьми.

Это довольно хорошо объяснено в документации Active Record в разделе Ленивая загрузка и полная загрузка .

...