2016-05-18 5 views
0

Я хотел бы, если это возможно (и как) использовать силу отношений OneToMany как фильтр findBy.Symfony2/Doctrine: findBy with OneToMany мощность

Например, здесь у меня есть два объекта User и Post с отношениями OneToMany между ними, чтобы пользователь имел коллекцию сообщений.

Я ищу способ, чтобы получить все пользователи, которые имеют по крайней мере один пост, то есть:
|user.posts| >= 1 или более программно count(user->getPosts()) >= 1

Я знаю, что это может быть достигнуто с помощью QueryBuilder или DQL, но Я совершенно уверен, что есть трюк, который позволяет заставить его работать с findBy.

Вот идея о том, что я готов сделать:

class UserRepository extends EntityRepository 
{ 
    public function myQuery() 
    { 
     return $this->findBy(
      array(... 'posts' ...), // What should I put here ? 
      array('email' => 'ASC') 
     ); 
    } 
} 
+2

вам нужно использовать QueryBuilder и установить, имеющий состояние на счет на почтовых записей – Matteo

+2

Не * имеет по крайней мере один пост * так же как и внутреннее соединение в этом случае? Но то, что вы хотите сделать, невозможно. Для подсчета вам понадобится предложение group by, которое недоступно при использовании 'findBy'. – Yoshi

+2

Вы не можете найти [поле ассоциации, потому что это обратная сторона ассоциации] (https://github.com/doctrine/doctrine2/blob/master/lib/Doctrine/ORM/ORMException.php#L190-L203). Методы поиска работают только над собственными ассоциациями. – jkucharovic

ответ

2

Люди в комментариях совершенно правы, поэтому я подведении:

  • findBy не будет работать на OneToMany, особенно потому, что вы хотите найти по количеству связанных объектов.

  • Это означает, что вы должны использовать QueryBuilder.

В вашем UserRepository, используйте следующее:

$qb = $this->createQueryBuilder('users') 
    ->leftJoin('user.posts', 'posts') 
    ->addGroupBy('users') 
    ->having('COUNT(posts) >= :limit') 
    ->setParameter('limit', 1); 
  • Поскольку в вашем случае использования, предел Posts вы хотите выбрать 1, как сказал @Yoshi, вы можете использовать INNER JOIN вместо GROUP BY + HAVING, который автоматически отменит выбор Users без Post.

Вместо того, что выше, используйте:

$qb = $this->createQueryBuilder('users') 
    ->innerJoin('user.posts', 'posts');