2012-03-28 39 views
1

多個表我有以下情形:加盟Doctrine2

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

我有三個表:projectclientdetailscompany

以下是它們之間的關係:

project有關company(通過companyid)。
clientdetailscompany(通過companyid)相關。

project name存儲在project表中。
company name存儲在company表中。
client name存儲在clientdetails表中。

我怎樣才能找回project nameproject表連同client name存儲在clientdetails表和company namecompany表使用學說2各自project

回答

1

這些映射實際上是不可能的。你至少缺少一個: 項目也應該知道clientdetails。假設你有一個項目的ID,你可以很容易地檢索公司的名字,但是根本無法找到哪個clientdetails行與該項目相關。

讓我給你一個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

所以,在查詢您將要替換GIVEN_ID在項目的ID。現在,它會很容易發現公司的名字,因爲這是一個簡單的連接companyid但讓我們看看其他加盟:

cd.companyid = c.id

這看起來很簡單,但實際上,映射到該公司的ID任何clientdetails將會是一場成功的比賽,因此絕對沒有保證(也沒有多少機會)您獲得了正確的客戶名稱。由於會有多個匹配項(如果您有多個客戶端映射到該公司),它將首先匹配它找到並返回該客戶端的名稱。這意味着您將始終擁有相同的客戶名稱。

但是,如果您將項目添加到Clientdetails的ManyToOne映射,您將能夠用cd.id = p.clientdetailsid替換cd.companyid = c.id,這將返回正確的名稱。

您還會注意到,當你正在使用doctrine2,你會做到這一點很容易像這種查詢將是無用的:

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

乾杯。