【发布时间】:2014-11-09 02:05:45
【问题描述】:
我有 3 个实体:Invoice、InvoiceItemService、Asset。
首先,我创建一个 Invoice 和一个 InvoiceItemService,并将它们与 InvoiceItemService 端的 ManyToOne 关系链接在一起(因此 InvoiceItemService 是所有者端)。
然后,我可以从 Invoice 对象创建一个资产。资产是发票的副本,总计为负数。当我创建资产时,我也将 Invoice 的 InvoiceItemService 链接到资产,在 InvoiceItemService 和资产之间具有多对一关系。
当我删除一个 Invoice 时,一切正常,Invoice、Asset 和 InvoiceItemService 使用 cascade={"remove"} 选项删除。
当我删除资产时,我只想删除资产。但是我得到了这个外键错误。
这是我的实体:
class Invoice
{
/**
* @ORM\OneToMany(targetEntity="Evo\BackendBundle\Entity\Asset", mappedBy="invoice", cascade={"remove"})
*/
protected $assets;
/**
* @ORM\OneToMany(targetEntity="Evo\BackendBundle\Entity\InvoiceItemService", mappedBy="invoice", cascade={"persist", "remove"})
*/
protected $services;
}
class Asset
{
/**
* @ORM\ManyToOne(targetEntity="Evo\BackendBundle\Entity\Invoice", inversedBy="assets")
* @ORM\JoinColumn(nullable=false)
* @Exclude
*/
protected $invoice;
/**
* @ORM\OneToMany(targetEntity="Evo\BackendBundle\Entity\InvoiceItemService", mappedBy="asset")
*/
protected $services;
}
class InvoiceItemService extends InvoiceItem
{
/**
* @ORM\ManyToOne(targetEntity="Evo\BackendBundle\Entity\Invoice", inversedBy="services")
* @ORM\JoinColumn(nullable=false, onDelete="CASCADE")
* @Type("Evo\BackendBundle\Entity\Invoice")
* @Exclude
*/
protected $invoice;
/**
* @ORM\ManyToOne(targetEntity="Evo\BackendBundle\Entity\Asset", inversedBy="services")
* @ORM\JoinColumn(nullable=true, onDelete="SET NULL")
* @Type("Evo\BackendBundle\Entity\Asset")
* @Exclude
*/
protected $asset;
}
【问题讨论】:
-
是否有其他实体可能依赖
Asset作为外键?您的错误可能与您在此处发布的这三者之间的关系完全无关。 -
我很确定问题出在这里,根据 SQL 错误:
a foreign key constraint fails (`evotest`.`sf_invoices_items_services`, CONSTRAINT `FK_38F5C7765DA1941` FOREIGN KEY (`asset_id`) REFERENCES `sf_assets` (`id`))实际上,当资产被删除时,我需要一个原则选项来将 InvoiceItemService 中的asset_id设置为 NULL .在 InvoiceItemService#asset 属性中尝试了@ORM\JoinColumn(nullable=true, onDelete="SET NULL"),但错误仍然存在 -
删除所有引用资产的 InvoiceItemService 项目由您决定。 D2 删除级联不够聪明,无法返回上游删除。
标签: symfony doctrine-orm foreign-keys constraints entity-relationship