好吧,可能是因为今天是星期一,也许是因为与我一起工作的一些人搞乱了我的大脑,但我需要问这个完全新手的问题,它可能会解决一些令人头痛的问题......
使用 Doctrine2 Mapping,我们可以在 EntityManager 和数据库中设置级联参数。
在本例中,我们有一个 User
和Client
。一User
属于Client
,但是一个Client
可以有多个User
.
当我们删除Client
时,其 User
必须设置client_id
至NULL
.
当我们删除User
时,它仅删除 User
.
User entity
manyToOne:
client:
targetEntity: AppBundle\Entity\Client
inversedBy: users
joinColumn:
name: client_id
referencedColumnName: id
onDelete: SET NULL
cascade: ["persist"]
Client entity
oneToMany:
users:
targetEntity: AppBundle\Entity\User
mappedBy: client
cascade: ["persist", "remove"]
此映射对于使用 remove
的上述情况应该没问题。来 self 们的 EntityManager 和 DELETE
来 self 们的数据库,对吗?
我们还有另一个案例,使用 oneToOne
关系。在这种情况下,我们有一个 Client
和一个 Shop
实体。一Client
只能有一个Shop
反之亦然。
当我们删除Client
时,其 Shop
也必须删除。
当我们删除Shop
时,它必须设置为NULL
它的关系,但因为 Shop
上没有反面,什么也没发生,我们把它放在Client
上,所以是Shop
谁有client_id
.
Shop entity
oneToOne:
client:
targetEntity: AppBundle\Entity\Client
cascade: ["persist", "remove"]
inversedBy: shop
joinColumn:
name: client_id
referencedColumnName: id
Client entity
oneToOne:
shop:
targetEntity: AppBundle\Entity\Shop
mappedBy: client
cascade: ["persist", "remove"]
据我所知,此映射将会中断,因为它将删除 Client
记录 Shop
被删除,这不应该发生,因为我们只想要 Shop
被删除,而不是两者都被删除。
最后但并非最不重要的一点是,我们有一个 oneToMany
单向关系,变成 manyToMany
对于连接表,它可能有一个带有额外字段的实体,但我们将使用一个简单的关系。
Client
有Phones
,但因为它是 ManyToMany
关系,这意味着 n Client
可以有n Phone
反之亦然,使用名为 client_has_phone
的连接表.
当我们删除Phone
时我们想从连接表 client_has_phone
中删除该关系。当我们删除 Client
时也会发生同样的情况,这种关系就永远消失了。
Client entity
manyToMany:
phones:
targetEntity: AppBundle\Entity\Phone
cascade: ["persist", "remove"]
joinTable:
name: client_has_phone
joinColumns:
client_id:
referencedColumnName: id
onDelete: CASCADE
inverseJoinColumns:
phone_id:
referencedColumnName: id
onDelete: CASCADE
此映射在 EntityManager 和数据库中都应该没问题。
我想就此提供一些建议,因为我确信事情按照我上面解释的那样进行,但也许我错了,Doctrine
文档没有很好地解释(至少在这一部分)。
而且,考虑到案例和示例映射,如果有错误,我想提供一个工作代码,以便改进我们的东西并告诉我的同事。
谢谢。
最佳答案
嗯,这是三个问题合而为一,但你知道了:
cascade=remove
将删除正在删除的Client
的所有User
,否则看起来没问题- 考虑一下:
商店实体
oneToOne:
client:
targetEntity: AppBundle\Entity\Client
cascade: ["persist", "remove"]
mappedBy: shop
客户端实体
oneToOne:
shop:
targetEntity: AppBundle\Entity\Shop
inversedBy: client
joinColumn:
name: shop_id
referencedColumnName: id
onDelete: SET NULL
cascade: ["persist"]
现在,当删除 Shop
时,数据库的 ON DELETE
设置 NULL
,并且 Doctrine 的 cascade=remove
将删除删除客户端
时商店
。
- 我觉得没问题
关于php - Doctrine2 Cascade的正确使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35695765/