Может ли кто-нибудь сказать мне, как получить косвенно связанные классы с помощью Propel ModelCriteria?

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

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

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


person iffs    schedule 17.11.2011    source источник
comment
@diEcho, есть проблемы с вопросом?   -  person iffs    schedule 17.11.2011
comment
слишком много текста, а в части кода слишком длинные имена переменных.   -  person diEcho    schedule 17.11.2011
comment
Извините, как я могу сделать это лучше? Это именно имена таблиц, думаю, я мог бы изменить их на буквы...   -  person iffs    schedule 17.11.2011
comment
напишите свой вопрос очень четко: чего вы хотите и что будет. Это оно.   -  person diEcho    schedule 17.11.2011
comment
Я немного изменил текст, посмотрите, станет ли он лучше для понимания.   -  person iffs    schedule 17.11.2011
comment
у меня действительно нет опыта в ORM. Я просто предлагаю вам спросить на форуме Propel.   -  person diEcho    schedule 17.11.2011
comment
Вопрос в следующем: IES — это Pessoa, и он также связан с другим Pessoa, его «iesm». Когда этот код применяется, объект Pessoa, который является IES, перезаписывается Pessoa, который является «iesm». Я хотел бы не перезаписывать эту информацию и фактически установить свойство под названием «iesm» внутри объекта IES.   -  person iffs    schedule 17.11.2011


Ответы (1)


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

Мой совет в этой ситуации:

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

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

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

person guiman    schedule 17.11.2011
comment
Спасибо за ответ, я собираюсь попробовать как можно скорее. - person iffs; 17.11.2011
comment
Что ж, идея объединения была интересной, но, похоже, я не могу использовать объединение с ModelCriteria даже в Propel 1.6. Итак, попробуем второе... - person iffs; 17.11.2011
comment
Собственно, второй совет натолкнул меня на мысль. Я пытаюсь смешать вашу идею с ModelCriteria и форматтерами Propel. Я дам более подробную информацию, если это работает. - person iffs; 17.11.2011
comment
К сожалению, массив строк, возвращаемый форматтеру, не содержит всей необходимой мне информации, опять же из-за пропел-маппинга. Думаю, мне придется сделатьSelectStmt, которого я пытался избежать, или получить эту информацию с помощью отдельных запросов в конце концов. Спасибо за помощь. - person iffs; 17.11.2011
comment
Кажется, у меня закружилась голова, да :P . Я рад, что по крайней мере у вас есть с чего начать. Скажите мне, если возникнут дополнительные вопросы - person guiman; 17.11.2011