Il y a plusieurs façons d'y parvenir, l'une serait de regrouper les résultats et d'utiliser HAVING
pour comparer le nombre de balises distinctes
$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')
]);
Cela sélectionnera uniquement les utilisateurs qui ont deux balises distinctes, qui ne peuvent être que Tag1
et Tag2
puisque ce sont les seuls qui sont joints. Au cas où le name
colonne est unique, vous pouvez compter sur la clé primaire à la place.
Le IN
d'ailleurs. est essentiellement le même que votre OR
conditions (le système de base de données développera IN
à OR
conditions en conséquence).