Как искать сообщения с двумя или более определенными тегами через PostSearchModel? - PullRequest
0 голосов
/ 02 мая 2018

Пожалуйста, помогите мне понять, как это сделать.

Например, у меня есть 3 тега:

  • А;
  • В;
  • С * * +1010

И 3 сообщения

  • Пост 1 с тегами: A B;
  • Пост 2 с тегами: B C;
  • Пост 3 с тегами: A B C.

Мне нужно искать только сообщения с тегами A, B, C. В этом примере только пост 3 содержит эти теги.

1 Ответ

0 голосов
/ 13 мая 2018

Если вы хотите найти сообщения со всеми тремя тегами, вам нужно создать запрос с тройным объединением - по одному объединению для каждого тега. Предполагая, что у вас есть отношение тегов, определенное как:

public function getTags() {
    return $this->hasMany(Tag::class, ['id' => 'tag_id'])
        ->viaTable('{{%posts_tags}}', ['post_id' => 'id']);
}

Вы должны быть в состоянии получить то, что вы хотите:

$posts = Post::find()
    ->innerJoinWith('tags as tags1', false)
    ->andWhere(['tags1.name' => 'A'])
    ->innerJoinWith('tags as tags2', false)
    ->andWhere(['tags2.name' => 'B'])
    ->innerJoinWith('tags as tags3', false)
    ->andWhere(['tags3.name' => 'C'])
    ->all();

В качестве альтернативы вы можете использовать COUNT() с GROUP BY и подсчитывать количество совпадающих тегов, но это будет ненадежно, если вы разрешите присваивать один тег несколько раз одному сообщению.

$posts = Post::find()
    ->innerJoinWith('tags', false)
    ->andWhere(['tags.name' => ['A', 'B', 'C']])
    ->groupBy('posts.id')
    ->having('COUNT(*) >= 3')
    ->all();
...