Работа с моделью в виде(view)

Рейтинг: 1Ответов: 1Опубликовано: 14.03.2015

Активируется контроллер Index:

public function actionIndex()
{
    return $this->render('index');
}

Далее, в view происходит выборка данных:

use app\models\Manuals;

    foreach(Manuals::find()->all() as $manual)
    {
        $authors = $manual->getAuthors()->all();
        echo $manual['title_'.Yii::$app->language].'___['.$manual['type'].']';
        foreach($authors as $author)
        {
            echo ' - '.$author['fio_'.Yii::$app->language];
        }
        echo '<br>';
    }

Всё работает и хорошо даже, это мне посоветовали на форуме, но, мне кажется, Вид(view) не должен вообще иметь никаких дел с моделью, ему дают данные - он их прорисовывает, но не выбирает.

Переместить этот код в контроллер - не могу, т.к.:

foreach(Manuals::find()->all() as $manual)

не работает, если задать вот так:

foreach($manuals as $manual)

где $manuals - это уже выбранные данные через контроллер.

А не работает, потому что:

$authors = $manual->getAuthors()->all();

Ошибка, функция не определена, когда я выборку в контроллере делаю и в foreach передаю уже объект.

Ответы

▲ 2
Manuals::find()->all()

Перемещаем в контроллёр и выбираем сразу с авторами с помощью жадной загрузки (будет всего 2 запроса) (если этого не сделать, то кол-во запросов будет равным 1 + count($manuals) ) В контроллёре код:

Manuals::find()->with(['authors'])->all()

Во вьюхе код:

foreach($manuals as $manual)
{
    ...
    foreach($manual->authors as $author)
    {
        ...
    }
    ...
}

Плюс, можете выбрать в виде массива, будет супер-круто по ресурсозатратам:

Manuals::find()->with(['authors'])->asArray()->all()