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

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

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

但现在我想找到同时拥有两个标签的所有用户.
我试过 – >而不是 – > 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')
    ]);

这将仅选择具有两个不同标记用户,这些标记只能是Tag1和Tag2,因为这些是唯一加入的标记.如果name列是唯一的,则可以指望主键.

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

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...