Existem algumas maneiras de conseguir isso, uma delas seria agrupar os resultados e usar
HAVING
para comparar a contagem das tags distintas $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')
]);
Isso selecionará apenas os usuários que tiverem duas tags distintas, que só podem ser
Tag1
e Tag2
pois estes são os únicos que estão sendo unidos. Caso o name
coluna é única, você pode contar com a chave primária. O
IN
por falar nisso. é essencialmente igual ao seu OR
condições (o sistema de banco de dados expandirá IN
para OR
condições em conformidade).