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


How to change default doctrine entity scheme?

默认的一对一关系方案为

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;

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

注:I有两个实体: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)

你试过孤儿移除吗?

来自官方文档:

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

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

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

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

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

的例子:

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