2016-05-25 24 views
2

doctrineの多対多の関係からフィルタ結果を取得する必要があります。Doctrine - ManytoManyフィルタ結果

Class Users extends RecordItem { 
    /** 
    * @Id @Column(type="integer") @GeneratedValue 
    * @var int 
    **/ 

    protected $id; 
    /** 
    * @ManyToMany(targetEntity="Company") 
    * @JoinTable(name="users_join_company", 
    *  joinColumns={@JoinColumn(name="user_id", referencedColumnName="id")}, 
    *  inverseJoinColumns={@JoinColumn(name="company_id", referencedColumnName="id")} 
    *  ) 
    */ 
    protected $companys; 

    /** 
    * @Column(type="string", length=100) 
    * @var string 
    */ 
    protected $username; 
    //edit - > added array collection - forgotten 
    public function __construct() { 
     $this->companys = new ArrayCollection(); 
    } 
} 

Class Company extends Recorditem { 

    /** 
    * @Id @Column(type="integer") @GeneratedValue 
    * @var int 
    **/ 
    protected $id; 

    /** 
    * @Column(type="string", length=100) 
    * @var string 
    */ 
    protected $company_name; 
} 

これまでのところ、私はすべての会社に次のコードを照会できました。フィルタを追加する適切な方法はありますか?例:あなたの場合

$s_program = $qb->getQuery()->setMaxResults(1)->getOneOrNullResult(); 

は試してみてください。配列コレクション内の3企業がありますが、あなたはこのようなものを使用することができ、クエリビルダで

$user = $entityManager->getRepository('Users')->findOneBy(['id'=>1]); 

$companys = $user->companys; // hope to return only company with the id 1 

foreach($companys as $company){ 
    echo $company->company_name; 
} 

答えて

1

あなたがたArrayCollectionを使用して、コレクションをフィルタリングしたい場合は...

http://doctrine-orm.readthedocs.io/projects/doctrine-orm/en/latest/reference/working-with-associations.html

例:

// I guess companies is an ArrayCollection 
$myDesiredCompanies = $companies->filter(function (Company $entry) { 
    return ($entry->getId() == 1); 
}); 

それはコレクションをフィルタリングし、ご希望の結果を新しいコレクションを返します

+0

はい、あなたは間違いなく、コードを単純化しようとしている間にArrayCollectionが構造体を削除しています。ありがとうございました。 – WyHowe

0

会社「ID」を指定すると1を返すようにしたいでしょうこの代用品:

$user = $entityManager->getRepository('Users')->setMaxResults(1)->getOneOrNullResult(); 

うまくいくかどうかわかりませんが、試してみてください!

+0

がテストされ、エラーが返されます。「メソッド名はfindByまたはfindOneByで開始する必要がありますが、ちょっと意図が理解されています。これを回避しようとします。 – WyHowe

0

あなたの問題は、企業が遅延ロードされ、あらゆる種類の制限の影響を受けないということです。 $user->getCompanies()は、常にすべての企業を返却します。

あなたは、QueryBuilderを使用し、b)フィルタ処理された結果セットのエンティティを水和する必要があります。

など。

$qb = $this->getEntityManager()->createQueryBuilder(); 
$users = $qb->select('u', 'c') // important - select all entities in query to avoid lazy loading which ignores query constraints 
    ->from('YourBundle:Users', 'u') 
    ->join('u.companys', 'c') 
    ->where('u.id = :userId') 
    ->andWhere('c.id = :companyId') 
    ->setParameter('userId', 1) 
    ->setParameter('companyId', 1) 
    ->getQuery() 
    ->getResult(); 

これはあなたのid 1(その1人のユーザー)を持つすべてのユーザーを取得し、あなたが取得するために代わりのgetResultのgetOneOrNullResult()を使用することができたい場合のみ1

に一致するidを持つ企業を取得しますシングルユーザー。

関連する問題