Предположим, что
PHP:
$phoneRepository->findPhonesByClients($clients);
вставляет в клиентов телефоны
=> внешнее изменение внутреннего состояния - что еще хуже =)
А я не предлагал загружать в клиентов телефоны.
Я дальше их на проспам рекламного предложения использовал)
Но суть в том, что загружать коллекцию объектов, где в каждом объекте есть другая коллекция объектов - по мне само по себе не хорошо.
Например, вы загрузили 100 объектов в главной коллекции, и каждый объект имеет ещё по 100 дочерних объектов.
Это уже 10000 объектов в ОЗУ.
Один раз мне дали оптимизировать кусок функционала SugarCRM, делать нечего - профайлер и разбираться.
Тормозил только datagrid. Начал разбираться. Именно такая ситуация там и возникла.
Там самописная ORM. Коллекция из 200 объектов, каждый из которых имел дочерние объекты. Дольше всего по времени выполнялись не SQL запросы. А построение самих объектов.
Притом не было 1 операции про которую можно было бы сказать, что именно она тормозила, тормозила сумма.
Переписал запросы используя их же ORM чтобы возвращался не граф объектов, а обычный array с необходимыми полями. Получил ускорение в 50-100 раз.
Вообще подобное решение - коллекция объектов, где каждый имеет коллекцию объектов в загруженном состояние - нужно разве что при импорте и в datagrid`ах.
С вышеуказанной php doctrine нравится элегантность этого решения для datagrid:
https://github.com/orocrm/crm/blob/master/src/OroCRM/Bundle/AccountBundle/Resources/config/datagrid.yml
Лучшее что я видел.
Формируется обычный DQL, возвращающий НЕ ОБЪЕКТЫ, а обычный массив. В красивейшей оболочке.
Где необходимость при работе с ORM - всегда получать коллекции объектов?
Часто это вижу. А потом жалобы "тормоза эти ваши ORM".