1

Orders我在我的 Symfony(使用学说)项目中定义了和之间的多对多关系Upgrades(anOrder可以与 zero 或 more 相关联Upgrades,并且 anUpgrade可以应用于 zero 或 more Orders)。

# schema.yml

Order:
  columns:
    order_id: {...}
  relations:
    Upgrades:
      class: Upgrade
      local: order_id
      foreign: upgrade_id
      refClass: OrderUpgrade

Upgrade:
  columns:
    upgrade_id: {...}
  relations:
    Orders:
      class: Order
      local: upgrade_id
      foreign: order_id
      refClass: OrderUpgrade

OrderUpgrade:
  columns:
    order_id: {...}
    upgrade_id: {...}

我想设置删除级联行为,这样如果我删除一个Order或一个Upgrade,所有相关的都会OrderUpgrades被删除。我放在哪里onDelete: CASCADE?通常我会把它放在关系部分的末尾,但这似乎意味着在这种情况下删除Orders会级联到删除UpgradesonDelete: CASCADE如果我将上述关系部分放入 schema.yml 中,Symfony + Doctrine 是否足够聪明,可以知道我想要什么?

4

3 回答 3

2

经过多次试验和错误,我能够让它工作的唯一方法是遵循 Jestep 评论中的建议并将包括 onDelete: CASCADE 在内的关系定义移动到链接表,所以最后它看起来像这样并且表现如何我希望它(删除从 Order 到 OrderUpgrade 以及从 Upgrade 到 OrderUpgrade 的级联):

# schema.yml

Order:
  columns:
    order_id: {...}

Upgrade:
  columns:
    upgrade_id: {...}

OrderUpgrade:
  columns:
    order_id: { type: integer, notnull: true, primary: true }
    upgrade_id: { type: integer, notnull: true, primary: true }
  relations:
    Order:
      onDelete: CASCADE
    Upgrade:
      onDelete: CASCADE

我必须说我对互联网上所有不同的 Doctrine Many-to-Many YML 示例感到有些不知所措,每个示例的关系都略有不同。令人沮丧的经历。

于 2010-05-28T19:27:34.817 回答
1

我几乎总是使用 Propel,但它应该基本相同。使用:onDelete:级联

应该:

Order:
  columns:
    order_id: {...}
  relations:
    Upgrades:
      onDelete: CASCADE
      class: Upgrade
      local: order_id
      foreign: upgrade_id
      refClass: OrderUpgrade
于 2009-09-28T19:17:24.507 回答
1

每次我需要级联多对多关系并找到不完整的答案时,我都厌倦了谷歌搜索,所以这是我对它的看法,这是迄今为止最完整的。

经过简单的测试,我得出结论,您应该定义所有 3 个实体中的关系。
- 仅在您想要加入的 2 个实体中执行此操作效果很好,但级联部分除外。
- 仅在连接表 (OrderUpgrade) 中执行此操作,但您不会获得在您的 2 个实体中生成的表单和表单过滤器代码。
- 在所有 3 个实体中执行此操作将为您提供两个世界。

在下面的示例中,虽然很冗长,但我更喜欢这样:
- 如果您删除一个 Property,相应的 PropertyLandlord 条目将被删除,而 Landlord 条目则保持不变。
- 如果你删除一个房东,同样的事情。
- 如果您删除 PropertyLandlord 记录,它只会删除链接条目并保持原样,我猜这是我们主要寻找的行为。

Property:
  columns:
    id:
      type: integer(8)
      primary: true
      autoincrement: true
    title:
      type: string(255)
      notnull: true
  relations:
    Landlords:
      class: Landlord
      local: property_id
      foreign: landlord_id
      refClass: PropertyLandlord

Landlord:
  columns:
    id:
      type: integer(8)
      primary: true
      autoincrement: true
    title:
      type: string(255)
      notnull: true
  relations:
    Properties:
      class: Property
      local: landlord_id
      foreign: property_id
      refClass: PropertyLandlord
      onDelete: CASCADE

PropertyLandlord:
  columns:
    property_id:
      type: integer(8)
      primary: true
      notnull: true
    landlord_id:
      type: integer(8)
      primary: true
      notnull: true
  relations:
    Property:
      local: property_id
      foreign: id
      class: Property
      onDelete: CASCADE
    Landlord:
      local: landlord_id
      foreign: id
      class: Landlord
      onDelete: CASCADE
于 2011-09-01T01:42:03.217 回答