Мне нужна помощь сообщества, если это возможно.
У нас есть проект на работе, и пришло время для рефакторинга. Мы используем PHP 5 и Propel 1.6 в качестве слоя ORM. Идея, на самом деле, довольно проста: мы пытаемся получить всю необходимую информацию одновременно.
Однако эта информация не всегда напрямую связана с основным классом (или, другими словами, с основной таблицей). Например:
return (
$this->leftJoin( "IES.Pessoa mant" )
->leftJoin( "mant.Papel subpapel" )
->where( "subpapel.tipo = ?", Tipo_papel::IES )
->leftJoin( "subpapel.RelacionamentoRelatedByIdSubPapel relm" )
->where( "relm.tipo = ?", Tipo_relacionamento::MANTENEDORA_IES )
->leftJoin( "relm.PapelRelatedByIdSuperPapel superpapel" )
->leftJoinWith( "superpapel.Pessoa iesm" )
->where( 'superpapel.tipo = ?', Tipo_papel::MANTENEDORA_IES )
);
Это код функции в ModelCriteria из нашего модельного слоя. Идея состоит в том, чтобы получить «iesm», связанный с одним «IES».
Но здесь у нас проблема. Бывает, что «IES» уже связан с одной сущностью «Pessoa». Таким образом, когда этот код будет применен, этот объект будет потерян, предоставляя место для сущности 'Pessoa', связанной с 'iesm'.
Итак, основной вопрос: я хотел бы установить свойство 'iesm' внутри объекта 'IES', а не Pessoa, который устанавливается из-за сопоставления Propel. При этом, как я могу это сделать? Это вообще возможно? Я хотел бы установить 'iesm' на основе псевдонима, созданного в leftJoinWith.
И еще один вопрос, который возник сразу после этого: если нет прямой связи в базе данных, как я могу установить этот объект, используя ту же идею? Попытка объяснить лучше: этот 'iesm' на самом деле является объектом типа 'Pessoa_juridica'. И «Pessoa_juridica» не имеет прямого отношения к «IES». Как можно установить Pessoa_juridica внутри объекта IES?
Я даже не знаю, является ли это лучшим способом его использования, поэтому любые другие идеи приветствуются. Если вам нужны дальнейшие объяснения, просто дайте мне знать.