php - Doctrine2 Cascade的正确使用

标签 php mysql symfony doctrine-orm

好吧,可能是因为今天是星期一,也许是因为与我一起工作的一些人搞乱了我的大脑,但我需要问这个完全新手的问题,它可能会解决一些令人头痛的问题......

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

在本例中,我们有一个 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"]

此映射对于使用 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对于连接表,它可能有一个带有额外字段的实体,但我们将使用一个简单的关系。

ClientPhones ,但因为它是 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文档没有很好地解释(至少在这一部分)。

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

谢谢。

最佳答案

嗯,这是三个问题合而为一,但你知道了:

  1. cascade=remove 将删除正在删除的 Client 的所有 User,否则看起来没问题
  2. 考虑一下:

商店实体

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/

    相关文章:

    php - 如何使用 Codeigniter 互连三个 mysql 表

    php - 如何使用PHP检查数据库中是否存在用户

    mysql - 除非指定主键,否则防止从表中删除 *

    MySQL 查询获取最新记录

    php - Youtube API 下载字幕(以PHP为例)

    mysql - C 代码无法在 cron 中运行选择查询

    forms - 如何对 Symfony2 表单集合项进行排序

    php - 交响乐 2 错误 : Call to a member function get() on a non-object

    Docker mac symfony 3 非常慢

    php - 无法执行 PDO 查询(无效参数号)但不无效