2016-05-18 3 views
0

FindByフィルタとしてOneToManyリレーションシップカーディナリティを使用することができますか(どのように)したいですか。Symfony2/Doctrine:OneToManyカーディナリティを持つfindBy

ここでは、ユーザーが投稿のコレクションを持つように、2つのエンティティUserPostの間に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) )。 Findメソッドは、サイド・アソシエーションを所有する場合にのみ機能します。 – jkucharovic

答えて

2

人々は完全に正しいですので、私は合算しています:

  • findByは動作しません。 OneToManyにあります。特に関連するエンティティの数で検索したいからです。

  • これはQueryBuilderを使用する必要があることを意味します。あなたのUserRepository

、以下を使用します。

$qb = $this->createQueryBuilder('users') 
    ->leftJoin('user.posts', 'posts') 
    ->addGroupBy('users') 
    ->having('COUNT(posts) >= :limit') 
    ->setParameter('limit', 1); 
  • @YoshiあなたはINNER JOINを使用することができ、言ったように、あなたのユースケースでは、選択したいPostsの制限は、1であるので、 GROUP BY + HAVINGの代わりにUsersを自動的に選択解除します。Postはありません。代わりに、上記で何の

、これを使用する:

$qb = $this->createQueryBuilder('users') 
    ->innerJoin('user.posts', 'posts'); 
関連する問題