如何匹配与一组特定的其他记录关联的记录?
How to match records that are associated with a specific set of other records?
我正在尝试向我的项目添加两个不同的搜索变体。
有一个模型 "User" 和一个模型 "Tag"。一个用户有很多标签。
现在我希望能够搜索具有特定标签的用户。
要么我想显示所有具有任何指定标签的用户。
我是这样工作的:
$query = $this->Users->find();
$query->matching('Tags', function ($q) {
return $q->where(['Tags.name' => 'Tag1'])
->orWhere(['Tags.name' => 'Tag2']);
});
但现在我想找到同时拥有两个标签的所有用户。
我试过 ->andWhere
而不是 ->orWhere
,但结果总是空的。
如何找到包含多个标签的用户?
谢谢
有几种方法可以实现这一点,一种是将结果分组并使用 HAVING
比较不同标签的计数
$query = $this->Users
->find()
->matching('Tags', function ($query) {
return $query->where(['Tags.name IN' => ['Tag1', 'Tag2']]);
})
->group('Users.id')
->having([
$this->Users->query()->newExpr('COUNT(DISTINCT Tags.name) = 2')
]);
这将 select 只有那些有两个不同标签的用户,这两个标签只能是 Tag1
和 Tag2
,因为只有这些用户被加入。以防万一name
列是唯一的,您可以改用主键。
IN
顺便说一句。与您的 OR
条件基本相同(数据库系统将相应地将 IN
扩展为 OR
条件)。
我正在尝试向我的项目添加两个不同的搜索变体。 有一个模型 "User" 和一个模型 "Tag"。一个用户有很多标签。 现在我希望能够搜索具有特定标签的用户。 要么我想显示所有具有任何指定标签的用户。 我是这样工作的:
$query = $this->Users->find();
$query->matching('Tags', function ($q) {
return $q->where(['Tags.name' => 'Tag1'])
->orWhere(['Tags.name' => 'Tag2']);
});
但现在我想找到同时拥有两个标签的所有用户。
我试过 ->andWhere
而不是 ->orWhere
,但结果总是空的。
如何找到包含多个标签的用户?
谢谢
有几种方法可以实现这一点,一种是将结果分组并使用 HAVING
比较不同标签的计数
$query = $this->Users
->find()
->matching('Tags', function ($query) {
return $query->where(['Tags.name IN' => ['Tag1', 'Tag2']]);
})
->group('Users.id')
->having([
$this->Users->query()->newExpr('COUNT(DISTINCT Tags.name) = 2')
]);
这将 select 只有那些有两个不同标签的用户,这两个标签只能是 Tag1
和 Tag2
,因为只有这些用户被加入。以防万一name
列是唯一的,您可以改用主键。
IN
顺便说一句。与您的 OR
条件基本相同(数据库系统将相应地将 IN
扩展为 OR
条件)。