2012-03-28 66 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(); 

干杯。