2010-02-16 2 views
1

Я создаю приложение чата с помощью codeigniter и doctrine.Исключить строки с помощью Doctrine ORM DQL (NOT IN)

Таблицы:
- Пользователь
- User_roles
- User_available

Отношения:
один пользователь имеет множество ролей. У пользователя ONE user_available есть один пользователь.

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

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

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

SELECT * от user_available WHERE NOT 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(); 

ответ

0

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

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

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

1

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

$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(); 
Смежные вопросы