2010-11-25 121 views
1

首先我想說的是非常感謝Doctrine開發人員,你們很搖滾! 我的問題是這樣的:Doctrine2 +加入條件

我有三個表:

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,而是創建第三個實體PersonEmail。

雖然我發現你的數據庫模式非常可疑。爲什麼電子郵件有很多人?在這種情況下OneToMany關係不應該足夠嗎?我沒有看到連接表的好處。

+0

原因是我有其他實體: 公司(id,name,isActive)和companyEmailRel(id,companyId,emailId,isActive) 最後所有電子郵件在一張表中。 – yaroslav 2010-11-25 14:47:22

0

主義不支持協會的條件,但有幾個方法來解決這個問題:

創建查詢你想要的相關實體的存儲庫方法。見QueryQueryBuilder

使用Collection Criteria API從getter(在您的實體中)中的集合中過濾非活動實體。如果該關聯標記爲「EXTRA_LAZY」,則將使用優化的查詢而不是檢索整個集合。這對於大型館藏非常有用。

使用Filter API過濾數據庫級別的非活動實體。當你幾乎總是想隱藏非活動(或刪除等)實體時,這非常有用。