CakePHP 3.x:跨多层关联表获取关联机构名称的疑问
当然可以实现,无需额外添加外键!
你完全不需要给expense表新增azinstitutions_id外键,利用现有的表关联关系就能直接获取AZinstitution表中的机构名称,下面给你两种常见的实现方式:
直接通过SQL查询关联获取
写SQL的时候,把三个表通过关联字段连接起来,就能一次性查询出Expense记录和对应的机构名称。举个示例:SELECT e.*, az.institution_name -- 直接获取机构名称 FROM expense e JOIN annual_operating_budget aob ON e.annual_operating_budget_id = aob.id JOIN azinstitution az ON aob.azinstitutions_id = az.id;这样查询返回的结果里,就会包含每条Expense对应的机构名称,不用修改任何表结构。
应用/ORM框架层面的关联导航
如果你是用ORM框架(比如Django ORM、Hibernate、Entity Framework等)开发,框架已经帮你封装了关联关系的处理。比如在Django中,假设你的模型定义了正确的外键关联:# 示例模型结构 class AZinstitution(models.Model): institution_name = models.CharField(max_length=100) class AnnualOperatingBudget(models.Model): azinstitution = models.ForeignKey(AZinstitution, on_delete=models.CASCADE) class Expense(models.Model): annual_budget = models.ForeignKey(AnnualOperatingBudget, on_delete=models.CASCADE)那你可以直接通过关联对象导航获取机构名称:
# 获取某条Expense对应的机构名称 expense = Expense.objects.get(id=1) institution_name = expense.annual_budget.azinstitution.institution_name框架会自动处理背后的关联查询,你不用手动写复杂的JOIN语句。
为什么不建议新增外键?
新增azinstitutions_id到expense表会造成数据冗余,而且可能带来数据不一致的风险——比如如果Annual Operating Budget里的机构外键更新了,但Expense里的没同步,就会出现数据错误。保持现有的关联链更符合数据库设计的范式,也更易维护。
内容的提问来源于stack exchange,提问作者Ken
相关产品推荐
相关产品推荐

