如何更改默认的学说实体方案?

时间:2014-08-13 12:42:35

标签: php mysql symfony doctrine-orm

默认的一对一关系方案是

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;

我可以使用doctrine实体配置创建此方案吗?

P.S。我有两个实体: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关系(知道我无法改变与{的关系非常重要{1}})

2 个答案:

答案 0 :(得分:1)

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

示例:

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

此详细信息还记录了here

答案 1 :(得分:1)

你试过Orphan Removal吗?

从官方文件:

  

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

     

OrphanRemoval与一对一,一对多和多对多协会合作

您可以像这样使用orphanRemoval=true选项:

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

希望这有帮助。