默认的一对一关系方案是
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。我有两个实体:Vendor
和Image
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}})
答案 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)
希望这有帮助。