在Doctrine2中连接多个表

时间:2012-03-28 11:20:50

标签: join doctrine-orm

我有以下情况:

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

我有三个表:projectclientdetailscompany

以下是它们之间的关系:

projectcompany(通过companyid)相关 clientdetailscompany(通过companyid)相关。

project name存储在project表格中 company name存储在company表中 client name存储在clientdetails表格中。

如何从project name表中检索project以及client name表中存储的clientdetailscompany name表中的company各自project使用原则2?

1 个答案:

答案 0 :(得分:1)

这些映射实际上是不可能的。你缺少至少一个: 项目也应该知道客户细节。

假设您有一个项目的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

因此,在该查询中,您将用项目的ID替换GIVEN_ID。现在很容易找到公司的名称,因为这是companyid上的一个简单连接,但让我们看看另一个连接:

cd.companyid = c.id

看起来很简单,但事实上,任何映射到该公司ID的客户详细信息都是成功的匹配,因此绝对不能保证(并且没有多少机会)获得正确的客户名称。因为将有多个匹配(如果您有多个客户端映射到该公司),它将找到它找到的第一个匹配并返回该客户端的名称。这意味着您将始终拥有相同的客户名称。

但是,如果您将Project中的ManyToOne映射添加到Clientdetails,则可以将cd.companyid = c.id替换为cd.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();

干杯。