Отображение ассоциации 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 достаточно умен, чтобы перейти только в базу данных, если коллекция еще не была загружена.