【问题标题】:How to change default doctrine entity scheme?如何更改默认的学说实体方案?
【发布时间】:2014-08-13 12:42:34
【问题描述】:

默认的一对一关系方案是

CREATE TABLE Product (
    id INT AUTO_INCREMENT NOT NULL,
    shipping_id INT DEFAULT NULL,
    PRIMARY KEY(id)
) ENGINE = InnoDB;
CREATE TABLE Shipping (
    id INT AUTO_INCREMENT NOT NULL,
    PRIMARY KEY(id)
) ENGINE = InnoDB;
ALTER TABLE Product ADD FOREIGN KEY (shipping_id) REFERENCES Shipping(id);

但我需要使用这个方案,但需要对其进行一些修改ON DELETE SET NULL ON UPDATE SET NULL;:

CREATE TABLE Product (
    id INT AUTO_INCREMENT NOT NULL,
    shipping_id INT DEFAULT NULL,
    PRIMARY KEY(id)
) ENGINE = InnoDB;
CREATE TABLE Shipping (
    id INT AUTO_INCREMENT NOT NULL,
    PRIMARY KEY(id)
) ENGINE = InnoDB;
ALTER TABLE Product ADD FOREIGN KEY (shipping_id) REFERENCES Shipping(id) ON DELETE SET NULL ON UPDATE SET NULL;

我可以用学说实体配置创建这个方案吗?

附:我有两个实体:VendorImage

BW\ShopBundle\Entity\Vendor:
    type: entity
    table: vendors
    id:
        id:
            type: integer
            id: true
            generator:
                strategy: AUTO
    oneToOne:
        image:
            targetEntity: BW\FileBundle\Entity\Image
            cascade: [persist, remove]

BW\FileBundle\Entity\Image:
    type: entity
    table: images
    id:
        id:
            type: integer
            id: true
            generator:
                strategy: AUTO
    fields:
        filename:
            type: string
            length: 255
            nullable: true

我使用oneToOne Unidirectional 关系。

所以当我删除Image 对象时,我有一个错误,因为我有Unidirectional 关系(重要的是要知道我不能更改与bidirectional 的关系)

【问题讨论】:

    标签: php mysql symfony doctrine-orm


    【解决方案1】:

    你试过Orphan Removal吗?

    来自官方文档:

    还有另一个级联概念,仅在从集合中删除实体时才相关。如果 A 类型的实体包含对私有实体 B 的引用,那么如果从 AB 的引用是删除实体 B 也应该被删除,因为它不再使用了。

    OrphanRemoval 适用于一对一、一对多和多对多关联

    您应该像这样使用orphanRemoval=true 选项:

    @OneToOne(targetEntity="Image", orphanRemoval=true)
    

    【讨论】:

    • 很有意思,我会尝试测试一下。
    【解决方案2】:

    当您删除引用实体时,您可以使用onDelete="CASCADE" 强制底层数据库在内部删除所有关联对象。

    例子:

    @ORM\JoinColumn(name="shipping_id", referencedColumnName="id", onDelete="CASCADE")
    

    这个细节也记录在here

    【讨论】:

    • 谢谢,但在我的情况下它不起作用,因为 onDelete="CASCADE" 没有更改默认架构
    • 我将我的示例添加到问题中
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-22
    • 1970-01-01
    相关资源
    最近更新 更多