如何匹配与一组特定的其他记录关联的记录?

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 只有那些有两个不同标签的用户,这两个标签只能是 Tag1Tag2,因为只有这些用户被加入。以防万一name 列是唯一的,您可以改用主键。

IN 顺便说一句。与您的 OR 条件基本相同(数据库系统将相应地将 IN 扩展为 OR 条件)。