Có một số cách để đạt được điều này, một là nhóm các kết quả và sử dụng HAVING để so sánh số lượng các thẻ riêng biệt
$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')
]);
Thao tác này sẽ chỉ chọn những người dùng có hai thẻ riêng biệt, chỉ có thể là Tag1 và Tag2 vì đây là những cái duy nhất đang được tham gia. Trong trường hợp name là duy nhất, bạn có thể dựa vào khóa chính để thay thế.
IN btw. về cơ bản giống với OR của bạn điều kiện (hệ thống cơ sở dữ liệu sẽ mở rộng IN thành OR điều kiện phù hợp).