Join 连接Doctrine2中的多个表

Join 连接Doctrine2中的多个表,join,doctrine-orm,Join,Doctrine Orm,我有以下情况: project----->company这些映射实际上是不可能的。您至少缺少一个: 项目还应该了解客户的详细信息 假设您有一个项目的ID,您可以轻松地检索公司名称,但根本无法找到与该项目相关的clientdetails行 让我给您一个SQL SELECT,它将帮助我解释: 从项目p、公司c、客户详细信息cd中选择p.name、c.name、cd.name,其中p.id=GIVEN\u id、p.companyid=c.id和cd.companyid=c.id 因此,在该查询中,您

我有以下情况:


project----->company这些映射实际上是不可能的。您至少缺少一个:
项目还应该了解客户的详细信息

假设您有一个项目的ID,您可以轻松地检索公司名称,但根本无法找到与该项目相关的clientdetails行

让我给您一个SQL SELECT,它将帮助我解释:

从项目p、公司c、客户详细信息cd中选择p.name、c.name、cd.name,其中p.id=GIVEN\u id、p.companyid=c.id和cd.companyid=c.id

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

cd.companyid=c.id

这看起来很简单,但事实上,任何映射到该公司ID的clientdetails都将是成功匹配,因此绝对不能保证(也不太可能)您获得正确的客户名称。由于将有多个匹配项(如果您有多个客户映射到此公司),它将获取找到的第一个匹配项并返回该客户的名称。这意味着您将始终使用相同的客户端名称

但是,如果添加从Project到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();

干杯。

使用这些映射实际上是不可能的。您至少缺少一个: 项目还应该了解客户的详细信息

假设您有一个项目的ID,您可以轻松地检索公司名称,但根本无法找到与该项目相关的clientdetails行

让我给您一个SQL SELECT,它将帮助我解释:

从项目p、公司c、客户详细信息cd中选择p.name、c.name、cd.name,其中p.id=GIVEN\u id、p.companyid=c.id和cd.companyid=c.id

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

cd.companyid=c.id

这看起来很简单,但事实上,任何映射到该公司ID的clientdetails都将是成功匹配,因此绝对不能保证(也不太可能)您获得正确的客户名称。由于将有多个匹配项(如果您有多个客户映射到此公司),它将获取找到的第一个匹配项并返回该客户的名称。这意味着您将始终使用相同的客户端名称

但是,如果添加从Project到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();
干杯