2012-03-28 3 views
1

에서 여러 테이블을 조인 나는 다음과 같은 시나리오가 : 나는 세 개의 테이블이Doctrine2

project -----> company <----- clientdetails

을 : project, clientdetailscompany.

다음은 이들 사이의 관계이다

project는 (companyid 통해) company에 관한 것이다.
clientdetailscompany (companyid을 통한)과 관련된 것입니다.

project 테이블에 저장됩니다.
company namecompany 테이블에 저장됩니다.
client nameclientdetails 테이블에 저장됩니다.

는 어떻게 project name 교리 (2)를 사용하여 각각의 project에 대한 company 테이블에서 clientdetails 테이블과 company name에 저장 client name과 함께 project 테이블을 검색 할 수 있습니다?

답변

1

사실 이러한 매핑에서는 불가능합니다. 적어도 하나는 부족합니다. 프로젝트는 clientdetails도 알아야합니다.

하나의 프로젝트 ID가 있으면 쉽게 회사 이름을 검색 할 수 있지만 해당 프로젝트와 관련된 클라이언트 세부 정보 행을 찾을 수있는 방법은 없습니다.

내가 당신에게 설명해 도움이 될 것입니다 SQL SELECT를 들어 보겠습니다 :

SELECT p.name, c.name, cd.name FROM project p, company c, clientdetails cd WHERE p.id = GIVEN_ID AND p.companyid = c.id AND cd.companyid = c.id

그래서, 그 쿼리에 프로젝트의 ID와 GIVEN_ID을 대체 할 것이다. 이것은 간단한 companyid에 가입하지만의 다른 살펴 보자이기 때문에 지금은 회사의 이름을 쉽게 찾을 수있을 것입니다 가입 :

cd.companyid = c.id

그것은 간단하게 보이지만 사실,이 회사의 ID에 매핑되는 모든 clientdetails 성공적인 경기가 될 것이므로 올바른 고객 이름을 얻을 수 있다는 보장은 없습니다 (많은 기회가 아님). 둘 이상의 일치 항목이 있으므로 (둘 이상의 클라이언트가이 회사에 매핑 된 경우) 먼저 일치하는 클라이언트 이름을 찾아서 반환합니다. 즉, 항상 동일한 고객 이름을 갖게됩니다.

그러나 Project에서 Clientdetails로 ManyToOne 매핑을 추가하면 cd.companyid = c.idcd.id = p.clientdetailsid으로 바꿀 수 있으며 올바른 이름을 반환합니다.

당신은 또한 당신이 그렇게 쉽게 할 것처럼 doctrine2 사용하는 경우 쿼리 이런 종류의 쓸모가있을 것이라는 점을 알 수 있습니다 :

$projectId = 1; //this is an example 
$project = App_Entities_Project::find($projectId); 
$projectName = $project->getName(); 
$companyName = $project->getCompany()->getName(); 
$clientdetailsName = $project->getClient()->getName(); 

건배.