Es gibt mehrere Möglichkeiten, dies zu erreichen, eine wäre, die Ergebnisse zu gruppieren und HAVING
zu verwenden um die Anzahl der unterschiedlichen Tags zu vergleichen
$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')
]);
Dadurch werden nur die Benutzer ausgewählt, die zwei unterschiedliche Tags haben, die nur Tag1
sein können und Tag2
da nur diese mitmachen. Falls der name
Spalte eindeutig ist, können Sie sich stattdessen auf den Primärschlüssel verlassen.
Der IN
übrigens. ist im Wesentlichen dasselbe wie Ihr OR
Bedingungen (das Datenbanksystem erweitert IN
zu OR
Bedingungen entsprechend).