Где поместить запрос обхода графа в DDD, избегая при этом сотен маленьких?

Так что я пытался сделать немного DDD в проекте, над которым я работаю, но я столкнулся с проблемой, которую я упомянул в названии.
У нас есть Entity.php генерируется консолью Symfony, с аннотациями Doctrine (я знаю, что это не так, как это должно быть сделано), и соответствующими EntityRepository.php,

Применимый граф объектов:
Post сущность содержит Messages коллекция, которая в свою очередь имеет ReadMessagesколлекция, потому что мы должны знать, кем она была прочитана. Чтобы узнать, является ли Post было прочитано, мы хотим оставить присоединиться Messages с ReadMessages фильтрация по пользователю нам нужно, и если есть какие-либо пустые ReadMessages, мы будем знать, что это не было прочитано.

Если мы используем метод в Post сущность перебирать все Messages и все ReadMessages для каждого из них Doctrine будет выполнять множество запросов, если мы не настроим связи как нетерпеливый, что мы не хотим, потому что тогда он будет извлекать ассоциации все время, когда мы просим Post; идеальным способом было бы использовать DQL-запрос, который загружает объединенные сущности, но поскольку нет способа получить доступ к хранилищу из сущности (кроме внедрения одного в другой — что я даже не знаю, возможно ли это) Я думаю, что единственный вариант — использовать сервис Symfony2, который вводит Doctrine. Дело в том, что мне не очень нравится добавлять еще один кусок в качестве помощника.

Есть ли другой способ сделать это?

Заранее спасибо.

0

Решение

Что если бы вы фильтровали свою коллекцию, используя критерии (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;
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]