就像stackoverflow一样,问题和标签之间存在多对多的关系。
运行这些symfony命令后:
./symfony doctrine:drop-db
./symfony doctrine:build-db
./symfony doctrine:build-model
./symfony doctrine:build-sql
./symfony doctrine:insert-sql
使用以下架构:
的schema.yml
Tag:
columns:
name:
type: string(10)
notnull: true
relations:
Questions:
class: Question
foreignAlias: Tags
refClass: QuestionTag
Question:
columns:
html:
type: string(1000)
relations:
Tags:
class: Tag
foreignAlias: Questions
refClass: QuestionTag
QuestionTag:
columns:
question_id:
type: integer
primary: true
tag_id:
type: integer
primary: true
relations:
Question:
class: Question
foreignAlias: QuestionTags
type: many
foreignType: one
Tag:
class: Tag
foreignAlias: QuestionTags
type: many
foreignType: one
在QuestionTag
链接表中,有助于建立Tag
和Question
表之间的多对多关系,我发现Doctrine只创建了一个'正常'索引。 tag_id
列。为什么在此列而不是question_id
列?我不知道。
我认为这很奇怪,因为Doctrine创建的索引应该 question_id
和tag_id
列上的,因此它应该成为“唯一”索引,而不是“正常”的,因为question_id
和tag_id
一起形成复合主键。
我的理解是否正确? 如果是的话,为什么Doctrine没有以正确的方式做到这一点?
答案 0 :(得分:2)
我相信Doctrine不支持复合主键(或外键)。请记住,Doctrine项目正在迅速发展,但它还很年轻。新功能一直在增加,但我不认为1.x分支计划多列密钥。
解决方法是创建一个唯一的主键列question_tag_id,作为QuestionTag表中的3个字段之一。
答案 1 :(得分:0)
如果我正确阅读您的代码,则不应在QuestionTag表中再次定义关系。
也可以手动创建两列的索引(只需在模式中定义它),尽管我还没有看到如何在Doctrine中的两列上应用唯一约束。