我有以下情况:
project -----> company <----- clientdetails
我有三个表:project
,clientdetails
和company
。
以下是它们之间的关系:
project
与company
(通过companyid
)相关
clientdetails
与company
(通过companyid
)相关。
project name
存储在project
表格中
company name
存储在company
表中
client name
存储在clientdetails
表格中。
如何从project name
表中检索project
以及client name
表中存储的clientdetails
和company name
表中的company
各自project
使用原则2?
答案 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();
干杯。