我在Orders
和Upgrades
之间的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是否足够聪明,可以知道我想要什么?
答案 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