0

我有一组完成了某个测试的用户和一个收到该测试邀请的用户列表。现在我想获取所有完成测试的用户。我认为区分两个集合(如数组)很简单,但只有Doctrine_Collection::merge()可能。

我的数据模型(为清楚起见,省略了很多):

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
4

1 回答 1

0

好的,我现在知道我必须通过 User 模型本身来解决这个问题。此 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();
于 2011-06-16T19:02:18.700 回答