Может кто-нибудь сказать мне, как получить косвенно связанные классы, используя Propel ModelCriteria? - PullRequest
1 голос
/ 17 ноября 2011

Мне нужна помощь сообщества, если это возможно.

У нас есть проект на работе, и пришло время для рефакторинга. Мы используем 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?

Я даже не знаю, является ли это лучшим способом его использования, поэтому любые другие идеи приветствуются. Если вам нужны дальнейшие объяснения, просто дайте мне знать.

1 Ответ

0 голосов
/ 17 ноября 2011

Хорошо, так что я думаю, что я понимаю, с чем вы имеете дело: Вы, что оптимизировать соединения с базой данных, но обнаружили это, потому что вам нужно объединить две разные несвязанные таблицы с другой, которая каким-то образом объединяет их.

В этой ситуации я советую:

  1. Попробуйте использовать UNION с пользовательским запросом.Поэтому создайте два критерия и используйте UNION для объединения результатов, чтобы это работало с выбранными полями, и обе таблицы должны быть одинакового размера и типа.Я не уверен, как это сделать, используя объекты Query, но я совершенно уверен, что это можно сделать с помощью классов Peer.Проверьте эту ссылку Запрос UNION с Propel ORM

  2. Не скрывать все объекты.Иногда гораздо эффективнее и более понятно использовать операторы (например, doSelectStmt ()) и извлекать информацию в виде массивов из отдельных запросов к базе данных, манипулировать ими и затем только гидрировать объекты, которые вы собираетесь использовать.

Помните, что у symfoyn также есть кэш (например, APC), что всегда полезно при работе с действительно большими таблицами, сложной информацией и повторяющейся информацией.

...