Det finns några sätt att uppnå detta, ett skulle vara att gruppera resultaten och använda HAVING
för att jämföra antalet distinkta taggar
$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')
]);
Detta kommer bara att välja de användare som har två distinkta taggar, som bara kan vara Tag1
och Tag2
eftersom dessa är de enda som ansluts. I fall name
kolumnen är unik, du kan räkna med primärnyckeln istället.
IN
btw. är i huvudsak samma som din OR
villkor (databassystemet expanderar IN
till OR
villkor i enlighet därmed).