2010-11-25 4 views
1

우선, Doctrine 개발자에게 큰 감사 인사를 전합니다. 내 문제는 다음Doctrine2 + join 조건

나는 세 개의 테이블이 있습니다

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; 
} 

작품 벌금을. 하지만 문제는 join 절의 추가 조건을 isActive = 1로 설정하기를 원한다는 것입니다. Doctrine2에서 어떻게 해결할 수 있습니까? 감사.

답변

0

ManyToMany에서는 작동하지 않지만 세 번째 엔티티 인 PersonEmail을 만듭니다.

데이터베이스 스키마가 매우 의심 스럽습니다. 이메일에 사람이 많은 이유는 무엇입니까? 이 경우 OneToMany 관계로 충분하지 않아야합니까? 나는 조인 테이블의 이점을 보지 못했다.

+0

이유는 다음과 같은 다른 항목이 있습니다. 회사 (ID, 이름, isActive) 및 companyEmailRel (id, companyId, emailId, isActive) 그리고 마지막으로 모든 이메일을 하나의 테이블에 포함합니다. – yaroslav

+0

하지만 가입 또는 기타 방식으로 추가 조건을 설정할 수 있습니까? – yaroslav

0

교리는 협회에서 조건을 지원하지 않지만,이 문제를 해결하는 방법은 여러 가지가 있습니다 :

원하는 관련 기관에 조회하는 저장소 방법을 만들기. QueryQueryBuilder을 참조하십시오.

Collection Criteria API을 사용하면 getter (사용자 엔터티)의 컬렉션에서 비활성 엔터티를 필터링 할 수 있습니다. 연결에 "EXTRA_LAZY"로 표시되면 전체 컬렉션을 가져 오는 대신 최적화 된 쿼리가 사용됩니다. 이것은 대규모 콜렉션에 매우 유용합니다.

Filter API을 사용하면 DB 수준에서 비활성 엔터티를 필터링 할 수 있습니다. 이것은 거의 항상 비활성 (또는 삭제 된 등) 엔터티를 숨기고 싶을 때 매우 유용합니다.