Yii2、ActiveQuery、subQuery 没有带 ID 的条目

Yii2, ActiveQuery, subQuery have not entry with ID

我找不到解决方案...我们有 mysql 个表

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

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

所以问题是 - 我需要 select 在一个查询中没有特定 roleID 的所有用户。用户也可以在角色中没有任何关系(例如 John 没有任何角色 ID,因此他应该在所有查询中被 selected)。

简单的查询是当用户有一些 roleID(我们可以用 ->joinWith() 来检查它) - 但我需要反转这个查询,select 所有除了一个 roleID 之外的用户。

问题是我们有 oneToMany (users->roles) 关系并且 Yii2 ->joinWith() 没有以正确的方式工作(我想,我希望我错了)。

有人可以帮忙处理吗?

如果 User 模型有 'roles' 关系并且 $excludedRoleId 是排除的 roleId,则此 returns 没有角色的用户或角色不是 $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();

如果想select所有没有任何角色的用户,那么简单SQL查询上面的问题就是

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

结果将 return “john” 因为他没有任何角色

在 Yii2 中,您可以编写生成上述查询的代码

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

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

$models=$query->all();