2011-06-16 40 views
0

我有一組完成特定測試的用戶以及一個獲得該測試邀請的用戶列表。現在我想取得所有沒有完成測試的用戶。我認爲這很容易區分兩個集合(如數組),但只​​有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 

回答

0

好了,現在我知道我必須通過用戶模型本身來解決這個問題。此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();