myks92
@myks92
Нашёл решение — пометь вопрос ответом!

Yii как убрать 101 запрос при получении связанных данных?

Всем привет! Вопрос по связям. Никак не могу разобраться, где нужно сделать with(''), чтобы не было много запросов при использовании связей в цикле foreach()

1. Получаю модель для view
$model = Event::findOne($id)

2. В view имею следующий код со связанными данными

<div class="profile-info-block">
            <div class="profile-info-full">
                <div class="event-users-block">
                    <?php if ($model->appointments[0]):?>
                        <?php foreach (array_unique(\yii\helpers\ArrayHelper::getColumn($model->appointments,'arena')) as $item => $value):?>
                            <div class="row">
                                <div class="col-sm-12"><?=$model->appointments[0]->arenaList[$value]?></div>
                                <?php foreach ($model->appointments as $appointment): ?>
                                    <?php if ($appointment->arena == $value):?>
                                        <?php if ($appointment->isAppointed):?>
                                            <div class="col-xs-12 col-sm-6 col-md-4 profile-users">
                                                <div class="profile-list-content">
                                                    <div class="profile-users-list border-bottom-none">
                                                        <div class="profile-users-list-row">
                                                            <div class="profile-users-photo-wrap">
                                                                <a class="profile-users-photo" href="<?=\yii\helpers\Url::to(['/user/profile/view', 'id'=> $appointment->certification->user_id])?>">
                                                                    <?=Html::img($appointment->profile->fullAvatarUrl,['class'=>'profile-users-photo-img'])?>
                                                                </a>
                                                            </div>

                                                            <div class="profile-users-info">
                                                                <div class="profile-user-title">
                                                                    <?=Html::a($appointment->profile->miniName, ['/user/profile/view', 'id'=> $appointment->certification->user_id])?>
                                                                </div>
                                                                <div class="profile-text">
                                                                    <?=$appointment->certification->infoCertification?>
                                                                </div>
                                                                <div class="admin">
                                                                    <?php
                                                                    if (Yii::$app->user->can('admin')) {
                                                                        echo  Html::a('<i class="fas fa-pencil-alt"></i>', ['/event/appointment/update', 'id' => $appointment->id], [
                                                                            'class' => 'btn-default btn-sm',
                                                                            'title' => Yii::t('appointment', 'Update')
                                                                        ]);
                                                                        echo Html::a('<i class="fa fa-trash"></i>', ['/event/appointment/delete', 'id' => $appointment->id], [
                                                                            'class' => 'btn-default btn-sm',
                                                                            'title' => Yii::t('appointment', 'Delete'),
                                                                            'data-confirm' => Yii::t('appointment', 'Are you sure to delete this item?'),
                                                                            'data-method' => 'post',
                                                                        ]);
                                                                    }
                                                                    ?>
                                                                </div>
                                                            </div>
                                                        </div>
                                                    </div>
                                                </div>
                                            </div>
                                        <?php endif;?>
                                    <?php endif;?>
                                <?php endforeach; ?>
                                <hr>
                            </div>
                        <?php endforeach; ?>
                    <?php endif;?>
                </div>
            </div>
        </div>


3. Связи выполнены так

Модель Event
class Event extends \yii\db\ActiveRecord
{
      ......
      /**
     * @return \yii\db\ActiveQuery
     */
    public function getAppointments(): ActiveQuery
    {
        return $this->hasMany(Appointment::className(), ['event_id' => 'id'])
            ->with('certification')
            ->orderBy('arena ASC');
    } 
      ......
}

Модель Appointment
......
         class Appointment extends \yii\db\ActiveRecord
         {
          /**
     * Получение аттестации
     * @return \yii\db\ActiveQuery
     */
    public function getCertification()
    {
        return $this->hasOne(Certification::className(), ['id' => 'judge_comitet_id']);
    }

    /**
     * Получение профилей
     * @return \yii\db\ActiveQuery
     */
    public function getProfile()
    {
        return $this->hasOne(Profile::className(), ['user_id' => 'user_id'])
            ->via('certification');
    }
         }
         .......



В панели debug выходят такие повторяющиеся запросы. Я хочу избавиться от них, потому что их становится больше чем 100 запросов!!!
5bae0e72d3276538172404.png

Может быть тогда не по связям получать эти данные, а в контроллере одним запросом и передавать в view?
Буду очень благодарен за критику и за любую помощь)))
  • Вопрос задан
  • 59 просмотров
Решения вопроса 1
myks92
@myks92 Автор вопроса, куратор тега Yii
Нашёл решение — пометь вопрос ответом!
Разобрался сам. Сделал with и joinWith прямо в связи

/**
     * @return \yii\db\ActiveQuery
     */
    public function getAppointmentsJudges(): ActiveQuery
    {
        return $this->hasMany(Appointment::className(), ['event_id' => 'id'])
            ->joinWith(['certification', 'certification.comitet', 'certification.category'])
            ->with(['profile'])
            ->andWhere([Judge::tableName().'.role' => Judge::ROLE]);
    }
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
$model = Event::find()->where(['id' => $id])->with([appointments])->one();

так попробовать можно
Ответ написан
slo_nik
@slo_nik Куратор тега Yii
Добрый день.
Если не ошибаюсь, то можно использовать так
$model = Event::find()->where(['id' => $id])->with(['appointments.certification'])->one();
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы