我很难为以下类似类别的场景选择正确的映射:
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
(换句话说,实际扇区类别(的记录将有两个隐式父级:具有相同family
和class
但sector
设置为NULL的A/A类记录,最顶端的类别,具有相同的族值但CCD_ 10和CCD_。
扇区记录将有0个孩子,但有2个父母,这意味着$spring_fruit_object->getParents()
将(急切地(返回像[natural_hydrated_object, greens_hydrated_object]
这样的食物实体集合。
事实上,考虑到上面列出的规则,我担心现有的关联映射都无法自动处理这个用例。我可能需要从存储库类构建自定义查询。
您将如何处理这种情况?非常感谢。
(关闭:这意味着每个家庭+阶级+部门只允许一种食物。你确定这是你想要的吗?看起来很奇怪(
我应该添加一个自动递增主键,将当前的主键转换为UNIQ索引,并将存储库与querybuilder一起使用吗?
IMO,应避免使用复合主键。它们可能很容易使用,因为它们很有意义,但是:
- 速度较慢
- 与日常工作不同,让你工作更慢
- 自动递增ID几乎不添加任何额外内容
- 您必须为某些事情生成一个组合id,比如路由
条令文档提到了3个用例(https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/tutorials/composite-primary-keys.html#use-case-1-dynomic-attributes(,所有这些都是有效的,但我只考虑案例1,因为这增加了真正的价值-你不必创建属性,简化了API。