Использование Propel's addMultipleJoin - PullRequest
0 голосов
/ 29 июля 2011

Исходя из предыдущего вопроса о подвыборах, у меня есть оператор SQL с несколькими критериями при объединении, например:

SELECT * FROM person
LEFT OUTER JOIN group_membership
  ON person.id = group_membership.person_id
  AND group_id = 1
WHERE group_membership.person_id is null;

К сожалению, Propel, ORM, который я использую с Symfony, не выглядит достаточно искусным при использовании нескольких объединений, и предыдущие люди пытались взломать критерии вместе для достижения результатов. Это сбило с толку Propel, и он начал использовать CROSS JOINs. Из того, что я прочитал , это было потому, что Propel не смог распознать идентификатор поля второго параметра:

$criteria->addJoin(self::ID, GroupMembershipPeer::PERSON_ID . ' AND ' .
    GroupMembershipPeer::GROUP_ID . '=' . $group_id,
    Criteria::LEFT_JOIN);

Затем я нашел метод addMultipleJoin () для Propel 1.4, который, кажется, работает в некоторой степени. Я не совсем понимаю, или как я могу назвать это, чтобы получить то, что я желаю:

$criteria->addMultipleJoin(array(
  array(
    'left' => self::ID,
    'right' => GroupMembershipPeer::PERSON_ID,
    'operator' => Criteria::EQUAL
  ),  
  array(
    'left' => GroupMembershipPeer::GROUP_ID,
    'right' => $group_id,
    'operator' => Criteria::EQUAL
  ),  
), Criteria::LEFT_JOIN);

Это приводит к некоторому странному SQL:

SELECT DISTINCT FROM `person` CROSS JOIN `group_membership` LEFT JOIN ON (= AND =) WHERE person.ID IN (3,5,17) AND group_membership.PERSON_ID IS NULL LIMIT 10

И PHP выдает странные ошибки:

Notice: Undefined offset: 0 in /path/lib/vendor/symfony/lib/plugins/sfPropelPlugin/lib/vendor/propel/util/Criteria.php on line 675

Кто-нибудь знает, что я или Пропел делают что-то не так, и как я могу это исправить или выполнить то, что мне нужно?

1 Ответ

1 голос
/ 30 июля 2011

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

$c->addJoin(array(self::ID, GroupMembershipPeer::GROUP_ID), array(GroupMembershipPeer::PERSON_ID, $group_id) );

Критерии поддерживают несколько условий соединения, начиная с версии Propel 1.3. Критерии doc

...