Ci sono alcuni modi per raggiungere questo obiettivo, uno potrebbe essere quello di raggruppare i risultati e utilizzare HAVING
per confrontare il conteggio dei tag distinti
$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')
]);
Questo selezionerà solo gli utenti che hanno due tag distinti, che possono essere solo Tag1
e Tag2
poiché questi sono gli unici a cui si sta unendo. Nel caso in cui il name
colonna è unica, puoi invece contare sulla chiave primaria.
Il IN
a proposito. è essenzialmente lo stesso del tuo OR
condizioni (il sistema di database espanderà IN
a OR
condizioni di conseguenza).