Различие двух экземпляров Doctrine_Collection - PullRequest
0 голосов
/ 16 июня 2011

У меня есть коллекция пользователей, которые прошли определенный тест, и список пользователей, которые получили приглашение на этот тест.Теперь я хотел бы выбрать всех пользователей, которые не не прошли тест.Я подумал, что было бы просто различать две коллекции (например, массивы), но возможен только 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

1 Ответ

0 голосов
/ 16 июня 2011

Хорошо, теперь я знаю, что я должен был подойти к этой проблеме через саму модель 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();
...