2016-08-19 3 views
1

私が試みていることが本当に可能かどうかわかりません。だから私はあなたたちにそれを尋ねると思った。私がやろうとしています何Doctrineがコレクションからすべてのエンティティを取得する

  • はコードで

与えられた企業に関連付けられているすべてのユーザーを取得する企業

  • のセットを取得:

    $companyIds = array(1,2,3); 
    $companies = $this->em->getRepository('AppBundle:Company')->findById($companyIds); 
    dump($companies->getUsers()); // this will not work, but I like it to work 
    

    次のように関連付けられている場所:

    class User implements AdvancedUserInterface, \Serializable 
    { 
        /** 
        * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Company", inversedBy="users") 
        * @ORM\JoinColumn(name="company_id", referencedColumnName="id", nullable=false) 
        */ 
        private $company; 
    } 
    
    class Company 
    { 
        /** 
        * @ORM\OneToMany(targetEntity="AppBundle\Entity\User", mappedBy="company") 
        */ 
        private $users; 
    } 
    
  • +1

    そのためのカスタムリポジトリメソッドを作成する必要があります。 –

    +0

    @EmanuelOster、あなたもそうです。私はそれをアーカイブするつもりです。あなたが正しい方向に小さなポインタを持っているなら、それは私を大きく助けるでしょう。 – DelphiLynx

    答えて

    3

    リポジトリには、エンティティの1つではなくArrayCollectionが返されます。そのため、それぞれ別々にアクセスする必要があります。

    これは動作するはずです:

    foreach($companies as $company) { 
        $company->getUsers(); 
    } 
    

    を上記の問題点は、(を呼び出すときに、必要に応じて)デフォルトでは、それは別のクエリでは、各会社のデータベースから(遅延ロード)のユーザーを取得することで、う大規模では非常に非効率的である。

    必要に応じていくつかの解決策があります。

    企業とのユーザーを常に取得するようにdoctrineを設定できます。これはeager fetchと呼ばれます。

    ユーザーを取得すると、すべてのユーザーを含む単一のコレクションを実現するために、ArrayCollectionをマージして(必要に応じて重複を削除する)ことができます。

    他の方法では、会社のリポジトリのカスタムメソッドで十分なDQLクエリを作成して、ユーザーと一緒に会社を取得することができます。ユーザーだけが必要で企業は必要ない場合は、会社のないユーザーだけを取得するクエリになる可能性があります。

    +0

    あなたの答えに感謝!あなたは大丈夫です、foreachはそれを行う方法です。しかし、DQLの小さな例がありますか?私はそれをアーカイブする方法を見たいです。私はCompanyRepositoryにカスタム関数を書くのが好きなので。 – DelphiLynx

    +1

    次のようなものがあります: 'cを選んで、cを選ぶcを選びます。c.users u' –

    +0

    ありがとう@dragoste、 – DelphiLynx

    1

    1つのクエリを持つユーザーを持つすべてのComapanyのエンティティをフェッチ:企業ユーザーをフェッチするとき

    $companies = $em->createQueryBuilder() 
        ->select('c, u') 
        ->from('AppBundle:Company', 'c') 
        // or left join based on you needs 
        ->innerJoin('c.users', 'u') 
        ->getQuery() 
        ->getResult(); 
    

    これは、クエリにはなりません。

    1

    はあなたのユーザーリポジトリにこのような何かを試してみてください:

    public function getAllUsersFromCompanies($ids) 
    { 
        $qb = $this->createQueryBuilder('u'); 
        $qb->leftJoin('u.company', 'c') 
         ->where('c.id IN :ids') 
         ->setParameter('ids', $ids) 
         ->getQuery(); 
    
         return $query->getResult(); 
    } 
    

    我々は、各ユーザーのために私たちの会社を与える、ここでは、会社のテーブルとユーザーテーブルに参加しています。次に、間違った会社を持つすべてのユーザーを除外します。

    関連する問題