两个Doctrine_Collection实例的差异

问题描述:

我有一组完成特定测试的用户以及一个获得该测试邀请的用户列表。现在我想取得所有没有完成测试的用户。我认为这很容易区分两个集合(如数组),但只​​有Doctrine_Collection::merge()是可能的。两个Doctrine_Collection实例的差异

我的数据模型(左得多为了清楚):

Invite: 
    columns: 
    id: integer (10) 
    relations: 
    users: 
     foreignAlias: invites 
     class: User 
     refClass: UserInvite 

UserInvite: 
    columns: 
    user_id: integer (10) 
    invite_id: integer (10) 
    relations: 
    user: 
     class: User 
     foreignAlias: userInvite 
    invite: 
     class: Invite 
     foreignAlias: userInvite 

Test: 
    columns: 
    id: integer (10) 
    user_id: integer (10) 
    invite_id: integer (10) 
    relations: 
    user: 
     class: User 
     foreignAlias: tests 
    invite: 
     class: Invite 
     foreignAlias: tests 

现在这两个集合都可以对我说:

$invite = new Invite; 
$invite = $invite->users; // All the users who got an invite 
$invite = $invite->tests; // All the tests performed for this invite 

什么是让所有的用户的最佳方法是什么?我可以执行SQL查询,但是我不想在OOP php或DQL查询中执行此操作。在SQL中,我可以做这样的事情:

SELECT u.name, u.id 
FROM user u 
    LEFT JOIN userinvite i 
     ON i.user_id = u.id 
    LEFT JOIN test t 
     ON t.user_id = u.id 
WHERE i.id IS NOT NULL 
AND t.id IS NULL 

好了,现在我知道我必须通过用户模型本身来解决这个问题。此DQL查询从特定邀请中提取所有错过其测试的用户:

$user = new User; 
$users = $user->getTable() 
       ->getQueryObject() 
       ->leftJoin('User.userInvite i') 
       ->leftJoin('User.tests t') 
       ->where('i.invite_id = ?', $invite->id) 
       ->andWhere('i.user_id IS NOT NULL') 
       ->andWhere('t.user_id IS NULL') 
       ->execute();