Могу ли я включить вспомогательный запрос в метод сущности Doctrine 2? - PullRequest
5 голосов
/ 04 августа 2011

Я хотел бы включить некоторые дополнительные функции в мои сущности Doctrine 2, чтобы они содержали код, который мне придется выполнять довольно часто.Например:

Пользователь - имеет много сообщенийПост - имеет одного пользователя

У меня уже есть функция $user->getPosts(), но это возвращает все мои сообщения.Я ищу написать $user->getActivePosts(), который будет выглядеть так:

$user->getPosts()->where('active = true') //if this were possibleили же:$em->getRepository('Posts')->findBy(array('user'=>$user,'active'=>true)) //if this were more convenient

Насколько я могу судить, нет способа вернуться к менеджеру сущностей через саму сущность, поэтому мой единственный вариант будет

class User {
   function getActivePosts() {
     $all_posts = $this->getPosts();
     $active_posts = new ArrayCollection();
     foreach ($all_posts as $post) {
        if ($post->getActive()) {
           $active_posts->add($post);
        }
     }
     return $active_posts;
}

Однако это требуетя загружаю ВСЕ посты в свой менеджер сущностей, когда я действительно хочу только небольшое их подмножество, и это требует от меня фильтрации в PHP, когда это было бы гораздо более уместно сделать на уровне SQL.Есть ли способ выполнить то, что я ищу, внутри сущности, или мне нужно создавать код вне нее?

1 Ответ

5 голосов
/ 05 августа 2011

Я думаю, вам следует реализовать метод на PostRepository, а не на модели сущностей.

Я стараюсь сохранить всю логику, связанную с моделью, в репозиториях за "доменными" методами.Таким образом, если вы измените способ представления того, является ли сообщение активным или нет, вам нужно всего лишь изменить реализацию одного метода вместо того, чтобы находить все операторы active = true, разбросанные по вашему приложению, или вносить изменения в "несвязанная "модель сущности.

как-то так

PostRepository extends EntityRepository {
  public function findActiveByUser($user){
     // whatever it takes to get the active posts
  }
}
...