【问题标题】:Diff of two Doctrine_Collection instances两个 Doctrine_Collection 实例的差异
【发布时间】:2011-09-16 07:22:22
【问题描述】:

我有一组完成了某项测试的用户,以及一份收到该测试邀请的用户列表。现在我想获取所有没有完成测试的用户。我认为区分这两个集合(如数组)很简单,但只有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

【问题讨论】:

    标签: php mysql collections doctrine doctrine-collection


    【解决方案1】:

    好的,我现在知道我必须通过 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();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多