CakePHP 3多对多关联场景下过滤查询不含指定角色的用户问题求助
问题排查与修复方案
原有代码错误点
- 逻辑反向:你在
notMatching中写的Roles.slug NOT IN条件,实际是过滤出「存在不属于目标三类角色的关联记录」的用户,和你要的「不存在属于目标三类角色的关联记录」的需求完全相反。 - 位置错误:
notMatching方法放在contain的回调中只会过滤关联返回的角色数据,不会对主表的用户查询结果产生过滤作用。
正确实现代码
$users = TableRegistry::getTableLocator()->get('Users'); $allUsers = $users->find('all', ['order' => ['Users.id ASC']]) ->select([ 'id', 'name', 'surname', ]) // 直接在主查询链调用notMatching,排除拥有指定角色的用户 ->notMatching('Roles', function ($q) { return $q->where(['Roles.slug IN' => ['interventor', 'editor', 'chief']]); }) // 如需关联加载用户的角色数据,单独配置contain即可 ->contain('Roles', function (Query $q) { return $q->select(['slug']); });
逻辑说明
notMatching的作用是排除主表中存在符合条件的关联记录的条目,我们将条件设置为匹配interventor、editor、chief三类角色,只要用户拥有这三类角色中的任意一个,就会被排除出查询结果,刚好符合你的需求。
注意:请提前确认Users表中已正确配置和Roles表的多对多关联,且指定了
users_roles作为连接表。
内容的提问来源于stack exchange,提问作者R0bertinski
相关产品推荐
相关产品推荐

