Как в Yii2 использовать метод toArray() для набора моделей, которые были получены с использованием with()
На пример есть модель Author у которого есть связь Book; Получаю набор авторов:
$books = Book::find()->with('author')->all();
В итоге, если использовать toArray(), то для каждой модели Book фреймворк выполняет еще один запрос в поисках автора;
Очень не удобно, для разработки rest/api
Ответы (1 шт):
Использовать 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();
}