У меня есть таблица статей и таблица комментариев. Статьи имеют много комментариев. Каждый комментарий имеет статус комментария (comment_status_id): 1. Хороший, 2. Плохой или 3. Уродливый.
Я хочу сделать запрос, чтобы найти все статьи, которые имеют ТОЛЬКО комментарии со статусом 3 (уродливые). То есть исключить Статьи, у которых есть какие-либо Комментарии со статусом 1 или 2.
Я могу написать подзапрос и запрос, чтобы получить все статьи с комментариями со статусом «Уродливый»:
$matchingComments = $this->Articles->getAssociation('Comments')->find()
->select(['article_id'])
->distinct()
->where(['comment_status_id' => 3]);
$query = $this->Articles->find()
->where(['Articles.id IN' => $matchingComments]);
Это дает мне все статьи, у которых есть любой комментарий со статусом 3. Но он также включает статьи, у которых есть комментарии со статусом 2 или 1, а также по крайней мере один комментарий со статусом 3.
Итак, мой вопрос: существует ли эффективный/элегантный способ заставить этот запрос работать с Query Builder, чтобы результатом были только статьи, содержащие комментарии, которые имеют ВСЕ comment_status 3 (Ugly)?
Я уверен, что смогу проанализировать результаты $query с помощью цикла for и построить новый массив результатов, но я хотел бы посмотреть, есть ли лучший способ сделать это в исходном запросе и/или/с подзапросом. Спасибо заранее за любые советы!
D.