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

时间:2016-09-14 22:53:40

标签: mysql activerecord yii2 relationships

我找不到解决方案......我们有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()工作方式不正确(我认为,我希望我错了)。

有人可以帮忙处理吗?

2 个答案:

答案 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();