在关于子选择的上一个问题之后,我在联接上有一条带有多个条件的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(我与Symfony一起使用的ORM)似乎并不擅长使用多个联接,并且以前的人们曾试图将标准结合在一起以达到结果。这样做使Propel感到困惑,并且开始使用CROSS JOINs。根据我的阅读,这是因为Propel无法识别第二个参数的字段ID:
$criteria->addJoin(self::ID, GroupMembershipPeer::PERSON_ID . ' AND ' . GroupMembershipPeer::GROUP_ID . '=' . $group_id, Criteria::LEFT_JOIN);
然后,我发现了Propel 1.4的addMultipleJoin()方法,该方法在某种程度上似乎可以正常工作。我并不完全理解它,或者我怎么称呼它来获得我想要的东西:
$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
有谁知道这是我本人还是Propel做错了什么,我该如何解决它,或完成我所需要的?
也许我错了,但是为什么你没有使用这样的东西:
$c->addJoin(array(self::ID, GroupMembershipPeer::GROUP_ID), array(GroupMembershipPeer::PERSON_ID, $group_id) );
自Propel 1.3起,条件就支持多种联接条件。条件文件