2010-02-16 87 views
1

我正在與codeigniter和教條建立一個聊天應用程序。排除行與學說ORM DQL(不)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

真的粘在這一個

編輯: 猜猜我不清楚。這些表格已經映射出來,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

不過,我認爲你可能會採用t他user_available表錯誤。由於它與用戶表匹配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();