我找不到解决方案......我们有mysql表
`users`
id | username
1 Mike
2 John
3 Jane
`roles`
userID | roleID
1 2
1 3
3 1
所以问题是 - 我需要在一个查询中选择所有没有特定roleID的用户。用户也不能在角色中有任何关系(例如,John没有任何角色ID,因此应该在所有查询中选择它。)
简单查询是指用户拥有一些roleID(我们可以使用 - > joinWith()进行检查) - 但我需要反转此查询,选择除了一个roleID之外的所有其他用户。
问题是我们有oneToMany(用户 - >角色)关系,Yii2 - > joinWith()工作方式不正确(我认为,我希望我错了)。
有人可以帮忙处理吗?
答案 0 :(得分:1)
如果用户模型具有'角色'关系且$ excludedRoleId被排除在roleId之外,则返回没有角色的用户或用户哪个角色不是$ 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();
答案 1 :(得分:0)
如果要选择所有没有任何角色的用户,那么对上述问题的简单SQL查询就是
SELECT username
FROM users
WHERE id NOT IN (SELECT userID FROM roles)
结果将返回“ john ”,因为他没有任何角色
在Yii2中,您可以编写代码以生成上述查询
$subQuery=Roles::find()->select('userID ');
$query = Users::find()->
select("username")->where(['not in', 'id', $subQuery]);
$models=$query->all();