Исключить строки с помощью Doctrine ORM DQL (NOT IN) - PullRequest
2 голосов
/ 16 февраля 2010

Я создаю приложение чата с codeigniter и доктриной.

Таблицы:
- пользователь
- User_roles
- Пользователь доступен

Отношения:
ОДИН пользователь имеет МНОГО ролей. ОДИН user_available имеет ОДНОГО пользователя.

Пользователи, доступные для чата, будут в таблице user_available.

Проблема:
Мне нужно, чтобы все пользователи в user_available, у которых нет role_id 7.

Так что мне нужно выразить в DQL что-то вроде (это даже не SQL, просто словами):

SELECT * из user_available ГДЕ НЕ user_available.User.Role.role_id = 7

Действительно застрял на этом

EDIT: Думаю, мне было неясно. Таблицы уже сопоставлены, и Doctrine выполняет работу INNER JOIN для меня. Я использую этот код, чтобы получить администратора, который ждал дольше всего, но теперь мне нужен пользователь:

$admin = Doctrine_Query::create()
        ->select('c.id')
        ->from('Chat_available c')
        ->where('c.User.Roles.role_id = ?', 7)
        ->groupBy('c.id')
        ->orderBy('c.created_at ASC')
        ->fetchOne();

Теперь мне нужно получить пользователя, который ждал дольше всего, но это НЕ работает

$admin = Doctrine_Query::create()
        ->select('c.id')
        ->from('Chat_available c')
        ->where('c.User.Roles.role_id != ?', 7)
        ->groupBy('c.id')
        ->orderBy('c.created_at ASC')
        ->fetchOne();

Ответы [ 2 ]

1 голос
/ 19 апреля 2010

Я понимаю, что проблема, вероятно, ушла к настоящему времени, но я делаю это для будущих читателей:

$admin = Doctrine_Query::create()
        ->select('c.id')
        ->from('Chat_available c')
        ->leftJoin('c.User u')
        ->leftJoin('u.Roles r')
        ->where('r.role_id != ?', 7)
        ->groupBy('c.id')
        ->orderBy('c.created_at ASC')
        ->fetchOne();
0 голосов
/ 18 февраля 2010

Для этого вам нужно сначала присоединиться к таблицам

Используйте внутреннее объединение, чтобы присоединить user_available.id к user.id

Однако я думаю, что вы, возможно, неправильно используете таблицу user_available. Поскольку он сопоставляется с таблицей пользователя 1: 1, разве вы не можете просто иметь поле is_available в своей таблице пользователя?

...