我正在努力为以下类场景选择正确的映射:
The food entity has a composed primary key made of 3 fields plus a name field:
╔════════╦═══════╦════════╦════════════════╗
║ family ║ class ║ sector ║ name ║ - family INT UNSIGNED NOT NULL
╠════════╬═══════╬════════╬════════════════╣ - class INT UNSIGNED DEFAULT NULL
║ 1 ║ NULL ║ NULL ║ Natural ║ - sector INT UNSIGNED DEFAULT NULL
║ 1 ║ 2 ║ NULL ║ Greens ║ - name VARCHAR(200) NOT NULL
║ 1 ║ 2 ║ 1 ║ Spring veggies ║ - PRIMARY KEY (family, class, sector)
║ 1 ║ 2 ║ 2 ║ Spring fruits ║
║ 1 ║ 2 ║ 3 ║ Summer veggies ║
╚════════╩═══════╩════════╩════════════════╝
此表与食品类别有关。它们只能是与family
+ class
+ sector
匹配的一个条目。填充的主键字段越多,类别记录就越“具体”。具有family
+ class
+ sector
(即实际的 sector 类别)的记录将具有2个隐式父级:a / A class < / em>记录,具有相同的family
和class
,但sector
设置为NULL,b /一个 family 记录,最高的类别,具有相同的家族值但是class
和sector
都设置为NULL。
一个部门记录将有0个孩子,但有2个父母,这意味着$spring_fruit_object->getParents()
将(急切地)返回食物实体的集合,例如[natural_hydrated_object, greens_hydrated_object]
。
实际上,考虑到上面列出的规则,我担心现有的关联映射都无法自动处理此用例。我可能必须从存储库类中构建自定义查询。
您将如何处理这种情况?谢谢。
答案 0 :(得分:0)
(关闭:这意味着每个家庭+班级+部门仅允许一种食物。确定要吃吗?似乎很奇怪)
我应该添加一个自动递增的主键,将当前的主组合键转换为UNIQ索引,然后将其简单地与querybuilder一起使用吗?
IMO,应避免使用复合主键。它们可能很诱人,因为它们很有意义,但是:
文档文档提到了3个用例(https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/tutorials/composite-primary-keys.html#use-case-1-dynamic-attributes),所有用例都是有效的,但我只考虑用例1,因为这增加了实际价值-您不必创建属性,就可以简化API。