【问题标题】:Yii2, ActiveQuery, subQuery have not entry with IDYii2, ActiveQuery, subQuery 没有 ID 条目
【发布时间】:2016-09-14 22:53:40
【问题描述】:

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

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

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

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

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

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

有人可以帮忙解决吗?

【问题讨论】:

  • 我不完全理解这个问题。我已经给出了一个假设你想要选择所有没有任何角色的用户的答案。检查它是否是你真正想要的.

标签: mysql activerecord yii2 relationships


【解决方案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();

【讨论】:

  • 你检查了吗? roles.roleID <> :roleId' 我认为这个条件会返回另一个角色......除了:roleId 之外的任何其他角色,不是吗?例如,如果我们要检查roles.roleID <> 2,一个用户的角色 ID 为 1,2,3,我们仍然会得到角色 ID 1 或 3 并看到该用户(我错了吗?)。我问是因为我做了同样的事情 - 结果是错误的。
  • 抱歉,我没有理解完整的请求。我已经更新了代码。现在它应该可以工作了!
【解决方案2】:

如果要选择所有没有任何角色的用户,那么对上述问题的简单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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-04
    • 2016-07-06
    相关资源
    最近更新 更多