Doctrine2 Cascade正确使用

时间:2016-02-29 09:20:00

标签: php mysql symfony doctrine-orm

嗯,可能是因为它是星期一,也许是因为我工作的一些人正在弄乱我的大脑,但我需要问这个可能解决一些令人头疼的新手问题......

使用Doctrine2 Mapping,我们可以在EntityManager和Database中设置我们的级联参数。

在这种情况下,我们有UserClient。一个User属于Client,但一个Client可以有多个User

当我们移除Client时,必须将其User设置为client_idNULL

当我们删除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,它可能有一个带有额外字段的实体,但我们将使用一个简单的关系

PhonesManyToMany,但由于它是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 文档没有得到很好的解释(在至少在这一部分)。

而且,考虑到案例和示例映射,如果有错误,我想提供一个有效的代码,以便改进我们的东西并告诉我的同事。

谢谢。

1 个答案:

答案 0 :(得分:0)

好吧,它有三个问题,但你去了:

  1. cascade=remove会移除所有User被删除的Client,否则看起来不错
  2. 考虑一下:
  3. 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删除ClientAsyncTask已删除。

    1. 对我来说似乎没问题