Hay algunas formas de lograr esto, una sería agrupar los resultados y usar HAVING
para comparar el recuento de las distintas etiquetas
$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')
]);
Esto seleccionará solo aquellos usuarios que tengan dos etiquetas distintas, que solo pueden ser Tag1
y Tag2
ya que estos son los únicos que se están incorporando. En caso de que el name
columna es única, puede confiar en la clave principal en su lugar.
El IN
por cierto. es esencialmente lo mismo que su OR
condiciones (el sistema de base de datos se expandirá IN
a OR
condiciones en consecuencia).