0

特定のテストを完了したユーザーのコレクションと、そのテストへの招待を受けたユーザーのリストがあります。ここで、テストを完了していないすべてのユーザーを取得したいと思います。2 つのコレクション (配列など) を比較するのは簡単だと思いましたが、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

これで、次の 2 つのコレクションを利用できるようになりました。

$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 に答える