1

OrdersSymfony (doctrine を使用) プロジェクトでとの間に定義された多対多の関係がありますUpgrades( anOrderは 0 個以上に関連付けることができUpgrades、 anは 0 個以上に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にカスケードすることを暗示しているようですUpgradesonDelete: CASCADESymfony + Doctrineは、上記の schema.yml の関係セクションに入れれば、私が何を望んでいるかを知るのに十分スマートですか?

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 多対多 YML の例のすべてに少し圧倒されたと言わざるを得ません。それぞれの関係はわずかに異なる場所にあります。イライラする経験。

于 2010-05-28T19:27:34.817 に答える
1

多対多の関係をカスケードし、不完全な答えを見つける必要があるたびに、それについてグーグルで検索するのにうんざりしているので、これまでのところ最も完全な入手可能なものです。

簡単なテストの後、3 つのエンティティすべてでリレーションを定義する必要があると結論付けました。
- 結合したい 2 つのエンティティだけで行うと、カスケード部分を除いてうまく機能します。
- 結合テーブル (OrderUpgrade) だけで実行しても機能しますが、2 つのエンティティで生成されたフォームとフォームフィルター コードを取得できません。
- 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
于 2011-09-01T01:42:03.217 に答える
1

私はほぼ常に Propel を使用していますが、本質的には同じはずです。使用: onDelete: CASCADE

次のようにする必要があります。

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