在symfony / doctrine的schema.yml中,我应该在哪里使用delete:CASCADE来实现多对多关系?

时间:2009-09-28 17:02:22

标签: database-design orm symfony1 doctrine data-modeling

我在OrdersUpgrades之间的Symfony(使用教义)项目中定义了多对多关系(Order可以与零或更多{{1}相关联并且Upgrades可以应用于零个或多个Upgrade)。

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。如果我将Upgrades放在schema.yml的上述关系部分中,那么Symfony + Doctrine是否足够聪明,可以知道我想要什么?

3 个答案:

答案 0 :(得分: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多对多YML示例感到有些不知所措,每个示例都有不同的关系。令人沮丧的经历。

答案 1 :(得分:1)

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

应该是:

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

答案 2 :(得分:1)

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

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

在下面的例子中,这是冗长的,但我更喜欢它:
- 如果删除属性,则删除相应的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