По возможности, мне нужна помощь со стороны сообщества.
У нас есть проект на работе, и настало время для рефакторинга. Мы используем 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», связанной с «iesm».
Итак, основной вопрос: я хотел бы установить свойство «iesm» внутри объекта «IES», а не Pessoa, который задан из-за сопоставления Propel. Это, как говорится, как я могу это сделать? Возможно ли это? Я хотел бы установить «iesm» на основе псевдонима, созданного на leftJoinWith.
И еще один вопрос, который проявился сразу после этого: если в базе данных нет прямого отношения, как я могу установить этот объект, используя ту же идею? Попытка объяснить лучше: этот «iesm» на самом деле является объектом типа «Pessoa_juridica». И «Pessoa_juridica» не имеет прямого отношения к «IES». Как можно установить эту «Pessoa_juridica» внутри объекта «IES»?
Я даже не знаю, является ли это лучшим способом его использования, поэтому любые другие идеи приветствуются. Если вы хотите получить дополнительное объяснение, просто дайте мне знать.
Хорошо, поэтому я думаю, что я не знаю, что вы имеете в виду: вам нужно оптимизировать соединения с базой данных, но обнаружил, что, поскольку вам нужно присоединиться к двум различным несвязанным таблицам с другим, который каким-то образом их объединяет.
Мой совет в этой ситуации:
Попробуйте использовать UNION с пользовательским запросом. Поэтому создайте два критерия и используйте UNION для объединения результатов, поскольку для работы с выбранными полями обе таблицы должны быть одинаковыми по размеру и типу. Я не уверен, как это сделать с помощью Query objets, но я уверен, что это может быть достигнуто с использованием классов Peer. Проверьте этот запрос UNION с помощью Propel ORM
Не скрывайте все объекты. Иногда его гораздо эффективнее и понятнее использовать операторы (например, doSelectStmt ()) и получать информацию в виде массивов из отдельных запросов к базе данных, манипулировать ими, а затем только увлажнять объекты, которые вы собираетесь использовать.
Помните, что symfoyn также имеет кеш (например, APC), это всегда хорошая идея при работе с действительно большими таблицами, сложной информацией и повторяющейся информацией.