Итерация по каждому человеку так, как вы это сделали, вполне допустима. Если вы хотите свести к минимуму попадания в базу данных, вы можете использовать некоторые операторы объединения, чтобы «предварительно выбрать» все, что вам нужно, всего за одну поездку в базу данных. Используя метод, подобный показанному здесь, попробуйте код ниже.
Если предположить, что одна-ко-многим отношения собака-> человек, а вторая ко многим отношениям-человек-> собака, то в вашем HouseRepository используйте метод, который извлекает все соответствующие данные в одном запросе, включая всех связанных лиц и собак и собак (с).
class HouseRepository extends ServiceEntityRepository
{
$qb = $this->createQueryBuilder('house')
->leftJoin('house.persons', 'persons')
->addSelect('persons')
->leftJoin('persons.dogs', 'dogs')
->addSelect('dogs')
->getQuery()->getResult();
}
Это, конечно, не проверено, и я подозреваю, что возвращенная структура данных будет настолько грязной, что даже если она сработает, ваш код может быть уродливым.