2016-09-14 78 views
0

我無法找到解決方案進入......我們有MySQL表Yii2,ActiveQuery,子查詢有沒有與ID

`users` 
id | username 
1  Mike 
2  John 
3  Jane 

`roles` 
userID | roleID 
1   2 
1   3 
3   1 

所以,問題是 - 我需要選擇具有在一個查詢不特定角色ID的所有用戶。用戶也可以沒有角色中的任何關係(例如John沒有任何角色ID,所以他應該在所有查詢中被選中)。

簡單的查詢是當用戶有一些角色ID(我們可以檢查它 - > joinWith()) - 但我需要顛倒此查詢,選擇具有任何其他除了一個角色ID的所有用戶。

問題是我們有oneToMany(用戶 - >角色)關係,而Yii2-> joinWith()沒有以正確的方式工作(如我所想,我希望我錯了)。

有人可以幫助應對呢?

+0

我完全不懂的疑難問題已經給上要選擇沒有任何誰所有用戶假設一個答案角色。檢查它是否真的是你想要的。 –

回答

0

如果你想選擇誰做不是所有用戶有什麼作用,那麼簡單的SQL查詢到上述問題是

SELECT username 
FROM users 
WHERE id NOT IN (SELECT userID FROM roles) 

,因爲他是沒有任何作用

結果將返回「 約翰

在Yii2,您可以編寫代碼來生成上述查詢作爲

$subQuery=Roles::find()->select('userID '); 

$query = Users::find()-> 
select("username")->where(['not in', 'id', $subQuery]); 

$models=$query->all(); 
1

如果用戶模型「角色」關係和$ excludedRoleId是排除的角色ID,這將返回用戶無需角色或用戶哪些角色是不是$ excludedRoleId

User::find() 
->joinWith(['roles']) 
->where('roles.userID IS NULL OR roles.userID NOT IN (SELECT userID FROM roles WHERE roleID = :roleId)', [':roleId' => $excludedRoleId]) 
->all(); 
+0

你檢查了嗎? 'roles.roleID <>:roleId''我認爲這個條件會返回另一個角色......除了':roleId'之外的任何其他角色,不是嗎?例如,如果我們要檢查'roles.roleID <> 2',我們仍然得到roleID 1或3並且看到用戶(我錯了嗎?),那麼一個用戶具有roleID 1,2,3。 我問,因爲我做了同樣的 - 結果是錯誤的。 – user1954544

+0

對不起,我還沒有理解完整的要求。我更新了代碼。現在它應該工作! –