Отображение ассоциации Doctrine2 с условиями

Возможно ли сопоставление ассоциаций с условиями в Доктрине 2.4? У меня есть сущность статьи и комментарий. Комментарии должны быть одобрены администратором. Статус одобрения комментариев сохраняется в логическом поле "одобрено".

Теперь у меня есть сопоставление ассоциации @OneToMany с комментариями в сущности Article. Он отображает все комментарии. Но я хотел бы наметить только одобренные комментарии.

Что-то вроде

@ORM\OneToMany(targetEntity="Comment", where="approved=true", mappedBy="article")

было бы очень полезно. К сожалению, AFAIK не существует такой вещи, как условие при отображении, поэтому я попытался решить свою проблему с наследованием - я создал два подкласса класса Comment. Теперь у меня есть ApprovedComment и NotApprovedComment и SINLE_TABLE сопоставление наследования.

 @ORM\InheritanceType("SINGLE_TABLE")
 @ORM\DiscriminatorColumn(name="approved", type="integer")
 @ORM\DiscriminatorMap({1 = "ApprovedComment", 0 = "NotApprovedComment"})

Проблема в том, что столбец "одобрен" является дискриминатором, я не могу использовать его как поле в сущности Комментарий больше.

Ответ 1

Вы можете использовать API критериев для фильтрации коллекции:

<?php

use Doctrine\Common\Collections\Criteria;

class Article
{

    /**
     * @ORM\OneToMany(targetEntity="Comment", mappedBy="article")
     */
    protected $comments;

    public function getComments($showPending = false)
    {
        $criteria = Criteria::create();
        if ($showPending !== true) {
            $criteria->where(Criteria::expr()->eq('approved', true));
        }
        return $this->comments->matching($criteria);
    }

}

Это особенно приятно, потому что Doctrine достаточно умен, чтобы перейти только в базу данных, если коллекция еще не была загружена.