嗯,可能是因为它是星期一,也许是因为我工作的一些人正在弄乱我的大脑,但我需要问这个可能解决一些令人头疼的新手问题......
使用Doctrine2 Mapping,我们可以在EntityManager和Database中设置我们的级联参数。
在这种情况下,我们有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"]
使用我们的EntityManager中的remove
和我们的数据库中的DELETE
,对于上述情况,这个映射应该没问题,对吗?
我们有另一个案例,使用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
,但由于它是Client
关系,这意味着n Phone
可以有n 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
Doctrine
此映射在EntityManager和Database中均应正常。
我想对此提出一些建议,因为我确信事情的效果正如我上面所解释的那样,但也许我错了,awk -v FS=";" 'NR>1{split($43,a,".");$43=sprintf("%04d-%02d-%02d",a[3],a[2],a[1])}1' OFS=";" fileIn
文档没有得到很好的解释(在至少在这一部分)。
而且,考虑到案例和示例映射,如果有错误,我想提供一个有效的代码,以便改进我们的东西并告诉我的同事。
谢谢。
答案 0 :(得分:0)
好吧,它有三个问题,但你去了:
cascade=remove
会移除所有User
被删除的Client
,否则看起来不错 Shop entity
oneToOne:
client:
targetEntity: AppBundle\Entity\Client
cascade: ["persist", "remove"]
mappedBy: shop
Client entity
oneToOne:
shop:
targetEntity: AppBundle\Entity\Shop
inversedBy: client
joinColumn:
name: shop_id
referencedColumnName: id
onDelete: SET NULL
cascade: ["persist"]
现在,当ON DELETE
被删除时,数据库的NULL
设置Shop
,而当一个主义cascade=remove
Shop
删除Client
时AsyncTask
已删除。