Как избежать зацикливания при получении связанных сущностей через доктрину?
Во-первых, ваш search() бесполезен, так как такую выборку можно сделать стандартным методом репозитория - findBy() или магическим findById1c().
Во-вторых, с чего вы взяли, что происходит какое-то зацикливание?Третий пункт не должен происходить, если вы, конечно, явно не указали с обеих сторон связи fetch="EAGER". Да и то Doctrine, вероятно, не допустила бы такой проблемы.
писать не через createQueryBuilder а нормальный dql запрос