两个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();