¿Cómo hacer coincidir los registros que están asociados con un conjunto específico de otros registros?

Estoy intentando agregar dos variaciones de búsqueda diferentes a mi proyecto. Hay un modelo “Usuario” y un modelo “Etiqueta”. Un usuario tiene muchas tags. Ahora quiero poder buscar usuarios con tags específicas. O quiero mostrar todos los usuarios que tienen alguna de las tags especificadas. Lo hice funcionar de esta manera:

$query = $this->Users->find(); $query->matching('Tags', function ($q) { return $q->where(['Tags.name' => 'Tag1']) ->orWhere(['Tags.name' => 'Tag2']); }); 

Pero ahora quiero encontrar todos los usuarios que tienen ambas tags al mismo tiempo. Intenté ->andWhere lugar de ->orWhere , pero el resultado siempre está vacío.

¿Cómo puedo encontrar usuarios que contienen múltiples tags?

Gracias

Hay algunas formas de lograr esto, una sería agrupar los resultados y usar HAVING para comparar el recuento de las distintas tags

 $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 tienen dos tags distintas, que solo pueden ser Tag1 y Tag2 ya que son las únicas en las que se unen. En caso de que la columna de name sea ​​única, puede contar con la clave principal.

El IN cierto. es esencialmente lo mismo que sus condiciones OR (el sistema de base de datos se expandirá IN a las condiciones OR consecuencia).