@Fear1

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

Не могу понять, как достать из таблицы все посты, в которых есть все нужные мне теги.
Использую следующую конструкцию:
$query = Card::find()->joinWith('tags')->where(['tags.id' => 2])->joinWith('tags t')->where(['t.id' => 1]);

Получаю все карточки, в которых есть tags.id = 1 и tags.id =2. Но так же карточки, в которых есть просто tags.id = 1, но без tags.id = 2.

Мне нужно найти все карточки, в которых есть и tags.id = 1, и tags.id =2, но не что-то одно. Где я свернул не туда?

Upd. Модели:

Tags.php
public function getCard()
    {
        return $this->hasMany(Card::className(), ['id' => 'card_id'])
                    ->viaTable('card_tags', ['tags_id' => 'id']);
    }


Card.php
public function getTags()
    {
        return $this->hasMany(Tags::className(), ['id' => 'tags_id'])
                    ->viaTable('card_tags', ['card_id' => 'id']);
    }
  • Вопрос задан
  • 126 просмотров
Решения вопроса 1
@Kulay
Вероятно, промежуточной таблицы достаточно, чтобы отфильтровать по id тега, так как он в ней присутствует
Card::find()
  ->leftJoin('card_tags t1', 't1.card_id = card.id')
  ->leftJoin('card_tags t2', 't2.card_id = card.id')
  ->where([
    'and',
    ['t1.tags_id' => 1],
    ['t2.tags_id' => 2]
  ]);
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы