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