Ваша проблема заключается в том, что вы относитесь к свойствам hasMany, ownTo, hasOne, и т. Д. Как к простым свойствам, а не рассматриваете их как двусторонние отношения. То, что я сделал во многих моих собственных платформах, - это инициализация этих свойств вручную программистом, но когда класс инициализируется, вы проверяете эти свойства и генерируете один объект, который связывает их вместе.
Создайте класс, подобный объекту System_DB_Relationship, и вы поместите одну и ту же копию в две инициализированные модели. Если вы не представляете свои модели как шаблон проектирования Factory, вы также можете использовать статическую модель $ Relationship для хранения ваших отношений. Я склонен идти на заводскую / активную запись, поэтому лучше ими управлять. Теперь, в зависимости от логики базового класса вашей модели, вы можете захотеть поместить флаг в отношение, чтобы сказать «эй, это отношение было использовано», поэтому вы больше не переходите в него.
Другой способ - всегда работать по убыванию. То есть игнорируйте hasMany, когда он найден, и создайте только прокси-метод для загрузки дочерних элементов, но загрузите все ownTo, чтобы родительский элемент загружался по умолчанию. Заметьте, однако, что эти методы могут стать опасными, если у вас большой набор классов, поэтому то, что я реализую в своих фреймворках, это обычно загрузка параметров, которые говорят, загружают X уровней отношений. И когда вы хотите использовать hasMany, вы просто используете __call (), чтобы перехватить вызов «$ myobject-> subobjects ()» и просто загрузить их на лету.
Есть множество способов сделать это, просто найдите время, чтобы отследить код вручную, посмотрите на то, что не имеет смысла, попробуйте что-нибудь, и вы в конце концов доберетесь до чего-то. Но, как сказал выше Франческо, редко полезно изобретать велосипед, если вы не работаете над действительно старыми проектами, которые нельзя изменить сразу. Возьмите эту работу, которую вы делаете, как возможность стать лучше и узнать, как она работает под капотом ...