代码之家  ›  专栏  ›  技术社区  ›  Clement Herreman

与refClass中属性的多对多关系

  •  2
  • Clement Herreman  · 技术社区  · 15 年前

    我目前正在设计一个网站,使用symfony(1.2)和Doctrine作为ORM。

    我有一节晚餐课、一节标准课和一节分数课。

    • 标准,并且具有私有属性, 比如马克的日期、马克的价值等。
    • 标记(或无)。

    在使用条令时,我使用以下代码在schema.yml中定义了此模型:

    Dinner:
      columns:
        date: { type: timestamp, notnull: true }
        nb_presents: { type: integer, notnull: true }
      relations:
        Marks:
          class:    Criteria
          local:    dinner_id
          foreign:  criteria_id
          refClass: Mark
    
    Criteria:
      columns:
        name: { type: string(50), notnull: true }
      relation:
        Marks:
          class:    Dinner
          local:    criteria_id
          foreign:  dinner_id
          refClass: Mark
    
    Mark:
      columns:
        criteria_id: { type: integer, primary: true }
        dinner_id: { type: integer, primary: true }
        value: { type: integer, notnull: true }
      relations:
        Dinner:
          local:    dinner_id
          foreign:  id
        Criteria:
          local:    criteria_id
          foreign:  id
    

    问题是SQL生成的条令,它添加了一个 FOREIGN KEY CONSTRAINT 在…上 Mark.dinner_id Dinner.id 它增加了一个 外键约束 晚餐 马克,晚餐 (这确实是不正确的,因为一顿晚餐可能会有很多痕迹)。

    我错过什么了吗?我是不是把这种班级关系弄错了?

    1 回复  |  直到 15 年前
        1
  •  3
  •   Jeremy Kauffman    15 年前

    您需要将关系定义为一对多关系。试试这个(注意晚餐和标准定义中添加的“type:many”:

    Dinner:
      columns:
        date: { type: timestamp, notnull: true }
        nb_presents: { type: integer, notnull: true }
      relations:
        Marks:
          class:    Criteria
          local:    dinner_id
          foreign:  criteria_id
          refClass: Mark
          type: many
    
    Criteria:
      columns:
        name: { type: string(50), notnull: true }
     relation:
       Marks:
         class:    Dinner
         local:    criteria_id
         foreign:  dinner_id
         refClass: Mark
         type: many
    
    Mark:
      columns:
        criteria_id: { type: integer, primary: true }
        dinner_id: { type: integer, primary: true }
        value: { type: integer, notnull: true }
      relations:
        Dinner:
          local:    dinner_id
          foreign:  id
        Criteria:
          local:    criteria_id
          foreign:  id