Закон Деметры. Нужен ли?
Допустим вы хотите купить молоко:

дом->лестница->машина_Opel->магазин->кассир_Люба->купить_молоко();

Так как вы уважающий себя software developer который не видит смысла в законе Деметры, вы это скорее всего напишете в 10 разных местах системы.

2 недели назад вы продали свой Opel и купили BMW. Вы теперь должны в 10 разных местах поменять код на:

дом->лестница->машина_BMW->магазин->кассир_Люба->купить_молоко();

Теперь, допустим вы начали переживать об экологии и хотите ездить за молоком не на машине, а на велосипеде. Вы теперь должны в 10 разных местах поменять код на:

дом->лестница->велосипед->магазин->кассир_Люба->купить_молоко();

Через пару дней Любу уволили и на работу взяли нового кассира Клаву? Меняем в 10 разных местах код на:

дом->лестница->велосипед->магазин->кассир_Клава->купить_молоко();

Через другую пару дней в вашем доме поставили лифт и вы не хотите бегать по лестнице за молоком? Меняем в 10 разных местах код на:

дом->лифт->велосипед->магазин->кассир_Клава->купить_молоко(); 

Мораль: этих всех замен можно мыло бы избежать, если бы для покупки молока вы использовали абстракцию:

магазин->купить_молоко();
я не считаю что это плохой код. Он хорош.

Просто его реализация скрытая внутри этого всего может быть ужасна… например если не забрать эти реляции сразу, или забрать и не использовать. (под забрать я понимаю SQL запрос который делается ORM) Уже не помню про доктрину. Но вот AR в yii точно поддерживает вытягивание реляций по параметрам.