2010-11-25 13 views
1

まず、Doctrineの開発者に大きな感謝を述べたいと思います。 私の問題は以下の通りです:Doctrine2 + join条件

私は3つのテーブルがあります。

person (id, name, isActive) 
email (id, address, isActive) 
personEmailRel(id, personId, emaiId, isActive) 

をそして私は、人によって電子メールのリストを取得したい:

/** 
* Unidirectional - Many persons have many emails 
* 
* @ManyToMany(targetEntity="Address_Model_Email") 
* @JoinTable(name="personEmailRel", 
* joinColumns={@JoinColumn(name="personId", referencedColumnName="id")}, 
* inverseJoinColumns={@JoinColumn(name="emailId", referencedColumnName="id")} 
*) 
*/ 
private $_emails; 

public function __construct() 
{ 
    $this->_emails = new Collections\ArrayCollection(); 
} 

public function getEmails() 
{ 
    return $this->_emails; 
} 

作品罰金を。しかし、問題は、結合節 isActive = 1に追加条件を設定したいということです。 Doctrine2でそれを解決するには?ありがとう。

答えて

0

ManyToManyでは動作しませんが、3番目のエンティティPersonEmailを作成します。

あなたのデータベーススキーマは非常に疑わしいと感じます。電子メールに人数が多いのはなぜですか?この場合、OneToMany関係で十分ではありませんか?私は結合テーブルの利点を見ていない。

+0

会社(id、name、isActive)とcompanyEmailRel(id、companyId、emailId、isActive) そして最後にすべての電子メールが1つのテーブルにあります。 – yaroslav

+0

しかし、追加条件を結合などで設定することは可能ですか? – yaroslav

0

Doctrineは団体での条件をサポートしていませんが、これを解決するには、いくつかの方法があります。

は、あなたが望む関連企業に照会リポジトリメソッドを作成します。 QueryおよびQueryBuilderを参照してください。

Collection Criteria APIを使用して、(エンティティ内の)ゲッター内の非アクティブなエンティティをコレクションからフィルタリングします。関連付けに「EXTRA_LAZY」とマークされている場合、コレクション全体を取り出す代わりに、最適化されたクエリが使用されます。これは大規模なコレクションには非常に便利です。

Filter APIを使用して、DBレベルでアクティブでないエンティティをフィルタリングします。ほとんどの場合、非アクティブ(または削除されたなど)エンティティを非表示にしたい場合には、これは非常に便利です。