Выполнение соединения с несколькими критериями в Propel 1.5 - PullRequest
3 голосов
/ 11 августа 2011

Этот вопрос вытекает из вопросов здесь и здесь .

Я недавно обновился до Propel 1.5 и начал использовать его функции запросов по критериям.У меня есть запрос, который я не могу перевести - левое объединение с несколькими критериями:

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

Его цель - найти всех людей, не входящих в указанную группу.Ранее для этого я использовал следующий код:

$criteria->addJoin(array(
  self::ID,
  GroupMembershipPeer::GROUP_ID,
), array(
  GroupMembershipPeer::PERSON_ID,
  $group_id,
),
Criteria::LEFT_JOIN);
$criteria->add(GroupMembershipPeer::PERSON_ID, null, Criteria::EQUAL);

Я рассмотрел выполнение запроса для всех людей в этой группе, получение первичных ключей и добавление NOT IN в массив, но там не былоЭто кажется особенно простым способом получить первичные ключи из находки, и это не выглядело очень элегантно.

В статье на codenugget.org подробно описано, как добавить дополнительные критерии кобъединение, которое я попытался:

$result = $this->leftJoin('GroupMembership');
$result->getJoin('GroupMembership')
  ->addCondition(GroupMembershipPeer::GROUP_ID, $group->getId());
return $result
  ->useGroupMembershipQuery()
    ->filterByPersonId(null)
  ->endUse();

К сожалению, 'useGroupMembershipQuery' переопределяет левое объединение.Чтобы решить эту проблему, я попробовал следующий код:

$result = $this
  ->useGroupMembershipQuery('GroupMembership', Criteria::LEFT_JOIN)
    ->filterByPersonId(null)
  ->endUse();
$result->getJoin('GroupMembership')
  ->addCondition(GroupMembershipPeer::GROUP_ID, $group->getId());
return $tmp;

По какой-то причине это приводит к перекрестному соединению по какой-то причине:

SELECT * FROM `person`
CROSS JOIN `group_membership`
LEFT JOIN group_membership GroupMembership ON
  (person.ID=GroupMembership.PERSON_ID
  AND group_membership.GROUP_ID=3)
WHERE group_membership.PERSON_ID IS NULL

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

1 Ответ

8 голосов
/ 14 сентября 2011

Propel 1.6 поддерживает несколько критериев для объединений с addJoinCondition(). Если вы обновите плагин Symfony или перейдете на sfPropelORMPlugin , вы можете воспользоваться этим. Затем запрос можно записать так:

return $this
  ->leftJoin('GroupMembership')
  ->addJoinCondition('GroupMembership', 'GroupMembership.GroupId = ?', $group->getId())
  ->where('GroupMembership.PersonId IS NULL');
...