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

时间:2015-06-19 12:43:08

标签: php mysql cakephp query-builder cakephp-3.x

我正在尝试为我的项目添加两种不同的搜索变体。 有一个模型“用户”和一个模型“标签”。用户有很多标签。 现在我希望能够使用特定标签搜索用户。 要么我想要显示所有具有任何指定标签的用户。 我这样做了:

$query = $this->Users->find();
$query->matching('Tags', function ($q) {
    return $q->where(['Tags.name' => 'Tag1'])
             ->orWhere(['Tags.name' => 'Tag2']);
});

但现在我想找到同时拥有这两个标签的所有用户。 我尝试了->andWhere而不是->orWhere,但结果始终为空。

如何找到包含多个标签的用户?

由于

1 个答案:

答案 0 :(得分:7)

有几种方法可以实现这一目标,一种方法是对结果进行分组,并使用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')
    ]);

这将仅选择具有两个不同标记的用户,这些标记只能是Tag1Tag2,因为这些是唯一正在加入的标记。如果是name列是唯一的,您可以指望主键。

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