Так что я пытался сделать немного DDD в проекте, над которым я работаю, но я столкнулся с проблемой, которую я упомянул в названии.
У нас есть Entity.php
генерируется консолью Symfony, с аннотациями Doctrine (я знаю, что это не так, как это должно быть сделано), и соответствующими EntityRepository.php
,
Применимый граф объектов:
Post
сущность содержит Messages
коллекция, которая в свою очередь имеет ReadMessages
коллекция, потому что мы должны знать, кем она была прочитана. Чтобы узнать, является ли Post
было прочитано, мы хотим оставить присоединиться Messages
с ReadMessages
фильтрация по пользователю нам нужно, и если есть какие-либо пустые ReadMessages
, мы будем знать, что это не было прочитано.
Если мы используем метод в Post
сущность перебирать все Messages
и все ReadMessages
для каждого из них Doctrine будет выполнять множество запросов, если мы не настроим связи как нетерпеливый, что мы не хотим, потому что тогда он будет извлекать ассоциации все время, когда мы просим Post
; идеальным способом было бы использовать DQL-запрос, который загружает объединенные сущности, но поскольку нет способа получить доступ к хранилищу из сущности (кроме внедрения одного в другой — что я даже не знаю, возможно ли это) Я думаю, что единственный вариант — использовать сервис Symfony2, который вводит Doctrine. Дело в том, что мне не очень нравится добавлять еще один кусок в качестве помощника.
Есть ли другой способ сделать это?
Заранее спасибо.
Что если бы вы фильтровали свою коллекцию, используя критерии (Doctrine\Common\Collections\Criteria
)? Я думаю, что это может решить вашу проблему. Вы можете прочитать о том, как сделать это подробно в документации Doctrine2 в 8.8.
Это так же просто, как вы определяете Criteria
как где сообщение читается и тогда вы получите отфильтрованный результат следующим образом:
/**
* Get all read messages
*
* @return Collection
*/
public function getReadMessages(){
$isReadCriteria = //... define criteria
$messages = $this->getMessages();
$readMessages = $messages->matching($isReadCriteria);
return $readMessages;
}
Других решений пока нет …