Как в Yii2 использовать метод toArray() для набора моделей, которые были получены с использованием with()

На пример есть модель Author у которого есть связь Book; Получаю набор авторов:

$books = Book::find()->with('author')->all();

В итоге, если использовать toArray(), то для каждой модели Book фреймворк выполняет еще один запрос в поисках автора;

Очень не удобно, для разработки rest/api


Ответы (1 шт):

Автор решения: cy4oHok

Использовать relation не очень хорошая идея (в этом месте я уже предчувствую как набегут эксперты, заминусят мой ответ и словесно сожгут меня на костре за этакое мракобесие :) ) Объясню почему. Представьте GridView и в одной из его ячеек Вам нужно вывести через relation данные из связанной таблицы. Это будет на каждую запись в GridView еще один запрос к БД вида select from where id =. Да Вы можете настроить нежадную выборку - тогда запрос будет всего один, но вида select from where id IN(id1,id2...idN), что тоже не очень быстрый запрос в зависимости от СУБД конечно.

Я бы Вам посоветовал в модели реализовать отдельный метод в котором Вы сами будете получать сразу все данные (по-странично, с группировками, сортировками и тп) максимально оптимизированным запросом и даже сразу в массив :) Например

/**
* @return array
*/
public function getAuthorsList() {
    return ( new Query() )->select(['a.id', 'a.firstname', 'a.secondname', 'a.lastname'])->from(Authors::tableName().' a')->innerJoin( LnkBookAuthors::tableName().' b2a', 'b2a.author_id = a.id' )->innerJoin( Books::tableName().' b', 'b2a.book_id = b.id' )->all();
}
→ Ссылка