2015-06-19 5 views
0

Я пытаюсь добавить к моему проекту два разных варианта поиска. Существует модель «Пользователь» и модель «Тег». Пользователь имеет много тегов. Теперь я хочу, чтобы иметь возможность искать пользователей с конкретными тегами. Либо я хочу показать всех Пользователей, у которых есть любой из указанных тегов. я получил это работает так:Как сопоставить записи, связанные с определенным набором других записей?

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

Но теперь я хочу, чтобы найти все пользователи, которые имеют обе метки одновременно. Я попробовал ->andWhere вместо ->orWhere, но результат всегда пуст.

Как я могу найти пользователей, которые содержат несколько тегов?

Благодаря

ответ

6

Есть несколько способов для достижения этой цели, один будет сгруппировать результаты и использовать HAVING сравнить количество из различных тегов

$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') 
    ]); 

Это будет выбирать только те пользователи, которые имеют два разных тега, которые могут быть только Tag1 и Tag2, поскольку они являются единственными, в которые вступают. В случае, если столбец name уникален, вы можете вместо этого использовать первичный ключ.

IN кстати. по существу совпадает с вашими условиями OR (система базы данных будет расширять IN до OR условий соответственно).

+0

Извините, мне потребовалось некоторое время. Но работает отлично! Спасибо большое! – conehead