Има няколко начина да постигнете това, единият е да групирате резултатите и да използвате 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 условия съответно).